アグリゲーションフレームワークでニーズを達成するために、最初のパイプラインステージは $match
になります ドキュメントを乗客配列内のユーザーと一致させる問題の乗客に対する操作と、それに続く $unwind
前の操作の入力ドキュメントからpassengers配列を分解して、各要素のドキュメントを出力する操作。別の$match
分解された配列に対する操作は、前のドキュメントストリームをさらにフィルタリングして、一致するドキュメントのみが変更されずに次のパイプラインステージに渡されるようにします。次のパイプラインステージでは、 $project
で必須フィールドが投影されます。 オペレーター。つまり、基本的にuser3
の集計パイプラインです。 次のようになります:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
結果 :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
更新 :
日付の異なるドライバーで重複をグループ化するには、前述のように、 $group
を実行できます。 最後の$project
の直前の操作 $sum
を使用して総乗客時間を計算するパイプラインステージ 演算子:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$group": {
"_id": "$driver",
"total": {
"$sum": "$passengers.times"
}
}
},
{
"$project": {
"_id": 0,
"driver": "$_id",
"total": 1
}
}
])
結果 :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}