Ada trik khusus tentang cara menanganinya, tetapi pertama-tama jika Anda memiliki MongoDB 2.6 atau lebih tinggi yang tersedia maka Anda dapat benar-benar melakukan apa yang Anda inginkan tanpa menggunakan $unwind
. Ini bisa sangat berguna untuk kinerja jika Anda memproses banyak dokumen.
Operator kunci di sini adalah $map
yang memproses array di tempat dan $allElementsTrue
operator yang akan mengevaluasi bidang "hasil" Anda. Penggunaan "peta" di sini memungkinkan pengujian larik "tes" dalam untuk melihat di mana bidang "hasil" di sana semuanya memenuhi kondisi yang sebenarnya. Dalam kasus larik luar, "hasil" ini dapat ditempatkan ke dalam dokumen tersebut sesuai kebutuhan Anda, dan tentu saja evaluasi penuh untuk dokumen mengikuti aturan yang sama:
db.test.aggregate([
{ "$project": {
"name": 1,
"result": {
"$allElementsTrue": {
"$map": {
"input": "$acts",
"as": "act",
"in": {
"$allElementsTrue": {
"$map": {
"input": "$$act.tests",
"as": "test",
"in": "$$test.result"
}
}
}
}
}
},
"acts": {
"$map": {
"input": "$acts",
"as": "act",
"in": {
"name": "$$act.name",
"result": {
"$allElementsTrue": {
"$map": {
"input": "$$act.tests",
"as": "test",
"in": "$$test.result"
}
}
},
"tests": "$$act.tests"
}
}
}
}}
])
Cara melakukannya di versi sebelumnya mengharuskan Anda untuk $group
kembali dalam dua langkah untuk "membangun kembali" array saat melakukan tes pada bidang "hasil" itu lagi. Perbedaan lain di sini juga menggunakan $min
operator sebagai false
akan dianggap sebagai nilai yang lebih rendah dari true
dan mengevaluasi konsep "allElements" yang sama:
db.test.aggregate([
{ "$unwind": "$acts" },
{ "$unwind": "$acts.tests" },
{ "$group": {
"_id": {
"_id": "$_id",
"name": "$name",
"actName": "$acts.name"
},
"result": { "$min": "$acts.tests.result" },
"tests": {
"$push": {
"name": "$acts.tests.name",
"result": "$acts.tests.result"
}
}
}},
{ "$group": {
"_id": "$_id._id",
"name": { "$first": "$_id.name" },
"result": { "$min": "$result" },
"acts": {
"$push": {
"name": "$_id.actName",
"result": "$result",
"tests": "$tests"
}
}
}}
])