2014-04-27 31 views
8

tôi đang cố gắng để có được mức trung bình của toàn bộ một lĩnh vực sử dụng khuôn khổ hợp ở Mông Cổ. Tuy nhiên tôi dường như không thể tìm thấy bất kỳ ví dụ sử dụng nó mà không có một tham số nhóm.Mongo truy vấn tập hợp trung bình không có nhóm

tôi có cấu trúc tài liệu sau đây:

{ 
     "_id" : ObjectId("5352703b61d2739b2ea44e4d"), 
     "Semana" : "2014-02-23 - 2014-03-01", 
     "bolsaDeValores" : "7", 
     "bvc" : "8", 
     "dollar" : "76", 
     "ecopetrol" : "51", 
     "dollarPrice" : "18" 
} 

Về cơ bản những gì tôi muốn làm là lấy giá trị trung bình của lĩnh vực BVC, và bất kỳ một số khác, đối với toàn bộ bộ sưu tập trong nhanh nhất có thể (không sử dụng MapReduce vì nó kém hiệu quả hơn Khung tổng hợp).

Tôi đã cố gắng để nhóm trên cơ sở lớn hơn không cũng nhưng không có kết quả:

db.EvaluatedSentiments.aggregate([ 
    { "$group": { 
     "bvc" : {"$gt:0"} 
     }, 
     { 
      "bvc" : { "$avg" : "$bvc"} 
     } 
    } 
]) 

Tôi đánh giá cao bất kỳ giúp bạn có thể cung cấp.

Tham chiếu: Mongo aggregation manual

+0

Nhóm bởi null thay vì – Sammaye

+0

Bạn thực sự nhận ra rằng không ai trong số các giá trị bạn hiện nay là thực sự số, không bạn? Họ thực sự là tất cả các chuỗi. –

+0

Điều đó là rất đúng, tôi đã không nhận ra về nó, một thiếu sót tôi thực hiện trong khi lưu trữ các vales. Cảm ơn – NicolasZ

Trả lời

28

Trước hết, lưu trữ giá trị bằng số. Sau đó bạn có thể sử dụng một tuyên bố đơn giản để tính toán tỷ lệ trung bình:

db.collection.aggregate({ 
    "$group": { 
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" } 
    } 
}) 

Bạn chỉ có thể sử dụng nhiều $avg khai thác tập hợp để có được trung bình cho trường số khác của bạn:

db.collection.aggregate({ 
    "$group": { 
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" }, 
    "avg_dollar": { "$avg": "$dollar" } 
    } 
}) 
+0

Cảm ơn, chính xác những gì tôi cần. – NicolasZ

+2

gần như bỏ lỡ "_id": null. điều này sẽ nhóm tất cả trong một! Thiên tài ! – Kay

2

Vì vậy, nếu dữ liệu của bạn thực sự được số nghĩa là không và ý định của bạn là loại trừ các tài liệu có giá trị "lớn hơn 0", sau đó bạn bao gồm tuyên bố $match trong đường ống tổng hợp để "lọc" ra các tài liệu sau:

db.EvaluatedSentiments.aggregate([ 
    { "$match": { 
     "bvc": { "$gt": 0 } 
    }}, 
    { "$group": { 
     "_id": null, 
     "bvc": { "$avg": "$bvc" } 
    }} 
]) 
+0

Cảm ơn bạn rất nhiều Neil. – NicolasZ

+0

Tôi muốn 0 giá trị để hiển thị trong danh sách nhưng trong avg tôi cần phải loại trừ số không .. Trong tình huống này không làm việc trên .. là có bất kỳ possiiblities để có được nó – user3211705

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