最初にvenueList
に基づいてコレクション内のドキュメントをフィルタリングする集約パイプラインを実行する集約フレームワークを使用する必要があります。 $match<を使用するID / code>
オペレーター。
2番目のパイプラインでは、 ventueList
をフラット化する必要があります。 およびsum
ドキュメント内のデータを非正規化エントリとしてパイプラインのさらに下流で処理するためのサブドキュメント配列。 $ unwind
>
ここでは演算子が便利です。
$matchを使用した追加のフィルター
解凍後に必要なのは、集約するドキュメントのみが次のパイプラインに入ることができるようにするためです。
メインのパイプラインは、 になります。 $ group
アキュムレータ演算子を使用して、フィルタリングされたドキュメントを集計し、目的の合計を作成する演算子ステージ $ sum
。目的の結果を得るには、 $ cond
独立したカウントフィールドを作成すると、ドキュメントの数が $ sum
名前の値に応じた式。
これをまとめると、次のパイプラインを実行することを検討してください。
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
]
}
}
}
}
])
mGoで使用する場合は、 httpのガイダンスを使用して、上記のパイプラインを変換できます。 //godoc.org/labix.org/v2/mgo#Collection.Pipe
上記よりもはるかに高速に実行され、合計リストの不明な値も考慮に入れる、より柔軟でパフォーマンスの高い代替案については、次のように代替パイプラインを実行してください
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"
}
}
}
}
])