Anda harus menggunakan kerangka kerja agregasi tempat Anda akan menjalankan saluran agregasi yang pertama-tama memfilter dokumen dalam koleksi berdasarkan venueList
id menggunakan $match
operator.
Pipa kedua akan memerlukan perataan venueList
dan sum
array subdocument agar data dalam dokumen diproses lebih lanjut ke pipa sebagai entri yang didenormalisasi. $unwind
operator berguna di sini.
Filter lebih lanjut menggunakan $match
diperlukan setelah melepas sehingga hanya dokumen yang ingin Anda gabungkan yang diizinkan masuk ke pipeline berikutnya.
Pipeline utama adalah $group
tahap operator yang menggabungkan dokumen yang difilter untuk membuat jumlah yang diinginkan menggunakan operator akumulator $sum
. Untuk hasil yang diinginkan, Anda perlu menggunakan operator tenary seperti $cond
untuk membuat bidang penghitungan independen karena itu akan memasukkan jumlah dokumen ke $sum
ekspresi tergantung pada nilai nama.
Secara keseluruhan, pertimbangkan untuk menjalankan pipeline berikut:
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
]
}
}
}
}
])
Untuk penggunaan dengan mGo, Anda dapat mengonversi saluran di atas menggunakan panduan di http://godoc.org/labix.org/v2/mgo#Collection.Pipe
Untuk alternatif yang lebih fleksibel dan berkinerja lebih baik yang dieksekusi jauh lebih cepat daripada yang di atas, dan juga mempertimbangkan nilai yang tidak diketahui untuk daftar jumlah, jalankan jalur alternatif sebagai berikut
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"
}
}
}
}
])