2011-06-20 22 views
6

Hãy nói rằng tôi có một tập dữ liệu như sau:cách nhanh nhất để có được tỷ lệ trung bình của một lĩnh vực cụ thể trong MongoDB

{ "_id" : ObjectId("4dd51c0a3f42cc01ab0e6506"), "views" : 1000, "status" : 1 } 
{ "_id" : ObjectId("4dd51c0e3f42cc01ab0e6507"), "views" : 2000, "status" : 1 } 
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 3000, "status" : 1 } 
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 4000, "status" : 0 } 

cách nhanh nhất là gì (hiệu suất-khôn ngoan) để có được số lượng trung bình các quan điểm cho tất cả các tài liệu có trạng thái 1? Map/Reduce có cần thiết cho thứ gì đó cơ bản như thế này không, hoặc có cách nào khác không?

Trả lời

7

Sử dụng nhóm: http://www.mongodb.org/display/DOCS/Aggregation

bạn cần một bộ đếm cho các tài liệu và một cho tổng của quan điểm. Cuối cùng bạn chỉ cần làm một bộ phận trên hai số này.

db.test.group(
    { cond: {"status": 1} 
    , initial: {count: 0, total:0} 
    , reduce: function(doc, out){ out.count++; out.total += doc.views } 
    , finalize: function(out){ out.avg = out.total/out.count } 
}); 
5

nhanh hơn cách để có được trung bình trong mọi trường hợp - precalculate nó (có thể là bạn có thể làm điều này trong nền) và tạo thêm lĩnh vực/bộ sưu tập để lưu trữ nó.

+2

Chỉ cần tự hỏi tại sao lại trừ đi? Có gì sai với câu trả lời của tôi? –

Các vấn đề liên quan