MongoDb集約の$group
引数に関する質問があります。次のように私のデータ構造が見えます:
マイ"イベント"コレクションは、この単一のドキュメントが含まれています
{
"_id": ObjectId("mongodbobjectid..."),
"name": "Some Event",
"attendeeContainer": {
"min": 0,
"max": 10,
"attendees": [
{
"type": 1,
"status": 2,
"contact": ObjectId("mongodbobjectidHEX1")
},
{
"type": 7,
"status": 4,
"contact": ObjectId("mongodbobjectidHEX2")
}
]
}
}
マイ"連絡先"コレクションはこれらの文書が含まれています
{
"_id": ObjectId("mongodbobjectidHEX1"),
"name": "John Doe",
"age": 35
},
{
"_id": ObjectId("mongodbobjectidHEX2"),
"name": "Peter Pan",
"age": 60
}
何I "イベント"コレクションのaggregate
クエリを実行し、fulを使用して次の結果を取得しますL「連絡先」データ:
"$unwind" : "$attendeeContainer.attendees",
"$lookup" : { "from" : "contactinfo", "localField" : "attendeeContainer.attendees.contact","foreignField" : "_id", "as" : "contactInfo" },
"$unwind" : "$contactInfo",
"$group" : { "_id": "$_id",
"name": { "$first" : "$name" },
...
"contact": { "$push": { "contact": "$contactInfo"} }
}
しかし、これは「接触」配列は、「イベント」であることにつながる:
{
"_id": ObjectId("mongodbobjectid..."),
"name": "Some Event",
"attendeeContainer": {
"min": 0,
"max": 10,
"attendees": [
{
"type": 1,
"status": 2,
"contact": {
"_id": ObjectId("mongodbobjectidHEX1"),
"name": "John Doe",
"age": 35
}
},
{
"type": 7,
"status": 4,
"contact": {
"_id": ObjectId("mongodbobjectidHEX2"),
"name": "Peter Pan",
"age": 60
}
}
]
}
}
私は(短縮版)は次のようになり、今使っているの引数各「attendeeContainer.attendees」にあるアレイの1つのドキュメントではなく、(グループ化されているため) 「連絡先」配列を「attendeeContainer.attendees」にプッシュするには?私が試したようなもの
(上記所望の出力に示すように):明らかに許可されていません
"attendeeContainer.attendees.contact": { "$push": { "contact": "$contactInfo"} }
しかし、MongoDBのを「」 $group
ステージ。
db.event.aggregate([
{ "$unwind": "$attendeeContainer.attendees" },
{
"$lookup" : {
"from" : "contactinfo",
"localField" : "attendeeContainer.attendees.contact",
"foreignField" : "_id",
"as" : "attendeeContainer.attendees.contactInfo"
}
},
{ "$unwind": "$attendeeContainer.attendees.contactInfo" },
{
"$group": {
"_id" : "$_id",
"name": { "$first": "$name" },
"min" : { "$first": "$attendeeContainer.min" },
"max" : { "$first": "$attendeeContainer.max" },
"attendees": { "$push": "$attendeeContainer.attendees" }
}
},
{
"$project": {
"name": 1,
"attendeeContainer.min": "$min",
"attendeeContainer.max": "$min",
"attendeeContainer.attendees": "$attendees"
}
}
])
デバッグのヒント
でパイプラインをデバッグ:
待ち時間!自分の[質問](https://stackoverflow.com/questions/40609209/mongodb-lookup-query-with-multiple-fields-from-objects-array)の複製を作成しましたか? – styvane
いいえ、私はしませんでした。前の質問は$ルックアップクエリに関連していました。これはグループ化に関連し、より複雑なシナリオを特徴とします。 –