Tôi là một người mới tương đối với MongoDB, nhưng từ những gì tôi đã đọc có nhiều phương pháp khác nhau để tìm kiếm trung bình và tổng các giá trị trong cơ sở dữ liệu MongoDB, với nhiều lợi ích và hạn chế khác nhau.'AVG' và 'SUM' chức năng trong MongoDB, bất kỳ lời khuyên?
Tôi chủ yếu yêu cầu một phương pháp tìm tổng giá trị lựa chọn và mức trung bình của một lựa chọn giá trị, theo phương thức hiệu quả (nhanh) có thể.
Các tài liệu trong bộ sưu tập được truy vấn giống cấu trúc này (với rất nhiều các lĩnh vực khác):
{
"_id": ObjectId('4e650107580fd649e5000005'),
"date_added": ISODate("2011-09-05T00:00:00Z"),
"value": 1500
}
Precalculating những thứ như tiền, trong ứng dụng của tôi, không phải lúc nào có thể, bởi vì việc lựa chọn các giá trị cho được tổng hợp có thể thay đổi (dựa trên phạm vi ngày - ví dụ: giữa ngày bắt đầu và ngày kết thúc, mức trung bình là gì). Đây là một vấn đề tương tự với trung bình tính toán trước.
Từ những gì tôi đã đọc, MapReduce chắc chắn không phải là lý tưởng cho tra cứu thời gian thực (tức là theo yêu cầu), do đó dường như cũng nằm ngoài câu hỏi.
Tại thời điểm tôi đang truy vấn bộ sưu tập theo cách này: (lưu ý: đây là sử dụng pymongo
)
response = request.db['somecollection'].find(
{
'date_added': {
'$gte': date_start,
'$lte': date_end
}
},
{
'value':1
}
).limit(500)
Sau đó làm việc tính bằng Python sử dụng một vòng lặp for
qua các phản ứng. Giới hạn 500 kết quả là tùy ý, để giữ cho nó trở nên quá chậm. Tôi chỉ lấy giá trị và không có trường nào khác.
Đây có phải là phương pháp hiệu quả nhất để thực hiện phép tính này hay không, hoặc có phương pháp nào khác để thực hiện những gì tôi cần không?
Hãy cẩn thận:
- tôi không thể sử dụng chức năng
group
bởi vì tôi có thể sẽ được sử dụng sharding trong tương lai - tôi không thể sử dụng MapReduce bởi vì nó là một chức năng mà sẽ được sử dụng trên -e-fly by users
- Tôi không thể tính toán trước số tiền/giá trị trung bình của tôi vì việc chọn giá trị cho tổng/giá trị trung bình gần như luôn khác nhau
- Tôi đã xem xét xung quanh stackoverflow và web để thử và tìm giới thiệu về cách làm loại điều, và nó khá bỏ ngỏ
EDIT:
Tôi phải chỉ ra rằng số lượng kết quả trả về từ truy vấn tôi đã đăng ở trên có thể là bất cứ điều gì từ 1 tài liệu đến hàng trăm, nhưng có thể sẽ có số lượng tài liệu trả về tối đa khoảng 150 (trung bình khoảng 60 hoặc 70)
Tôi chắc chắn sẽ thử nghiệm nhiều hơn với MapReduce. Tôi biết nó sẽ khác nhau giữa các tập dữ liệu/truy vấn/vv, nhưng trong trường hợp của bạn là nó đủ nhanh để không thực sự đáng chú ý cho người dùng (tức là dưới nửa giây)? – johneth
Thay đổi giữa 500-5000ms, nhưng một số bộ dữ liệu khá lớn (100M + tài liệu), vì vậy cần chỉ báo bận/tiến trình, nhưng đủ nhanh. Hiệu suất giảm bản đồ cũng sẽ cải thiện khi công cụ JavaScript được nâng cấp từ SpiderMonkey đơn luồng lên V8. –
Ah, điều đó nghe có vẻ hứa hẹn. Hiện tại, tập dữ liệu của tôi rất nhỏ (được đo bằng hàng nghìn, không phải hàng triệu), mặc dù điều này sẽ tăng theo thời gian. – johneth