Dokumen Kompleks Agregat Mongodb dengan Pencarian Bersarang
Saya memiliki koleksi ini:
Situs
{
_id: ObjectId("5acdb8f65ea63a27c1facf86"),
TemplateId: ObjectId("sdfsdfs34234234sdf"),
}
Template
{
_id: ObjectId("sdfsdfs34234234sdf"),
Type: "Site",
Name: "Site 1",
Sections:[{
id: ObjectId("8asdf89asd8f9sdf"),
Header: "Header1",
FieldItems: [
{
FieldId: ObjectId("jsd32423423423"),
x: 1,
y: 0
},
{
FieldId: ObjectId("2342sdffafdasdfdfs"),
x: 1,
y: 1
}
]
},
(...more sections...)
]
}
Fields
{
_id: ObjectId("jsd32423423423"),
Type: "Phone",
Name: "Phone_Test"
},
{
_id: ObjectId("2342sdffafdasdfdfs"),
Type: "Numeric",
Name: "Number_Test"
}
Saya baru mengenal MongoDB, tetapi telah menghabiskan beberapa hari membaca pertanyaan dan jawaban serta dokumentasi. Saya menggunakan MongoDB 4.2.6. Saya mencoba mengembalikan hasil dengan format seperti ini:
{
id: ObjectId("5acdb8f65ea63a27c1facf86"),
TemplateId: ObjectId("sdfsdfs34234234sdf"),
Template: {
id: ObjectId("sdfsdfs34234234sdf"),
Type: "Site",
Sections:[{
id: ObjectId("8asdf89asd8f9sdf"),
Header: "Header1",
FieldItems: [
{
FieldId: ObjectId("jsd32423423423"),
x: 1,
y: 0,
Field: {
_id: ObjectId("jsd32423423423"),
Type: "Phone",
Name: "Phone_Test"
}
}, (...)]
}]
}
Saya telah menulis kueri agregat dengan pencarian bersarang untuk membawa saya sebagian besar ke sana, tetapi untuk membuatnya bekerja, saya harus melepas Sections dan FieldItems . Saya belum menemukan cara untuk mendapatkan array seperti yang saya inginkan. Saya sudah mencoba grup tetapi mengalami masalah dengan sub array. Saya bahkan tidak yakin apakah ini cara terbaik untuk mendapatkan hasil yang saya butuhkan:
db.getCollection("AppSites").aggregate(
[
{
"$lookup" : { "from" : "AppTemplates", "let": {"template_id": "$TemplateId"},
"pipeline": [
{ "$match": { "$expr": { "$eq" : ["$_id", "$$template_id"] } } }, { "$unwind": "$Sections"}, { "$unwind": "$Sections.FieldItems"}, { "$lookup": {
"from": "AppFields",
"let": {"field_id": "$Sections.FieldItems.FieldId"}, "pipeline": [ { "$match": { "$expr": { "$eq": ["$_id", "$$field_id"] } } }
],
"as": "Sections.FieldItems.Field"
}
}
],
"as" : "Templates"
}
}
]
);
Jawaban
Anda telah melakukannya $unwind
dua kali, Jadi Anda perlu menggunakan dua kali $group
.
{
$group: { _id: { secId: "$_id",
fId: "$Sections.id" }, Type: { $first: "$Type" }, Name: { $first: "$Name" }, Header: { $first: "$Sections.Header" }, fieldItems: { $push: "$Sections.FieldItems" } } }, { $group: {
_id: "$_id.secId", Type: { $first: "$Type" }, Name: { $first: "$Name" }, Sections: { $push: {
id: "$_id.fId", Header: "$Header",
fieldItems: "$fieldItems"
}
}
}
}
- Grup pertama - untuk mengelompokkan objek anak. Tapi Type, Name dan Header masing-masing harus disetel ke larik induk dan anak.
- Grup kedua - untuk mengelompokkan objek induk. Kami mendapatkan setiap bidang mandiri saat mengelompokkan anak. Di sini hanya kita perlu mengaturnya dalam oreders yang benar.
Bekerja di taman bermain Mongo
Catatan: Saat Anda menggunakannya $lookup
, itu akan menyediakan sebuah array. Tetapi ada beberapa tempat yang Anda jadikan sebagai objek. Saya tidak tahu apakah Anda bergabung dalam hubungan satu-ke-satu atau tidak. Jika demikian, Anda dapat menggunakan operator posisi dalam proyeksi atau arrayElemAt