Bạn cần phải sử dụng khung tổng hợp, nơi bạn sẽ chạy một đường dẫn tổng hợp để lọc đầu tiên các tài liệu trong bộ sưu tập dựa trên venueList
id sử dụng $match
nhà điều hành.
Quy trình thứ hai sẽ đòi hỏi phải làm phẳng venueList
và sum
mảng subocument để dữ liệu trong tài liệu được xử lý sâu hơn dưới dạng các mục nhập không chuẩn hóa. $unwind
toán tử hữu ích ở đây.
Bộ lọc bổ sung bằng cách sử dụng $match
là cần thiết sau khi giải nén để chỉ những tài liệu bạn muốn tổng hợp mới được phép vào đường dẫn tiếp theo.
Đường dẫn chính sẽ là $group
giai đoạn toán tử tổng hợp các tài liệu đã lọc để tạo ra các khoản tiền mong muốn bằng cách sử dụng toán tử tích lũy $sum
. Để có kết quả mong muốn, bạn sẽ cần sử dụng toán tử một kỳ hạn như $cond
để tạo các trường đếm độc lập vì điều đó sẽ cung cấp số lượng tài liệu cho $sum
biểu thức tùy thuộc vào giá trị tên.
Đặt điều này hoàn toàn, hãy xem xét chạy đường dẫn sau:
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": null,
"linux": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "linux" ] },
"$venueList.sum.value", 0
]
}
},
"ubuntu": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "ubuntu" ] },
"$venueList.sum.value", 0
]
}
}
}
}
])
Để sử dụng với mGo, bạn có thể chuyển đổi đường dẫn trên bằng cách sử dụng hướng dẫn trong http://godoc.org/labix.org/v2/mgo#Collection.Pipe
Để có một giải pháp thay thế linh hoạt hơn và hoạt động tốt hơn, thực thi nhanh hơn nhiều so với cách trên và cũng xem xét các giá trị chưa biết cho danh sách tổng, hãy chạy đường dẫn thay thế như sau
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": "$venueList.sum.name",
"count": { "$sum": "$venueList.sum.value" }
}
},
{
"$group": {
"_id": null,
"counts": {
"$push": {
"name": "$_id",
"count": "$count"
}
}
}
}
])