Er is een bepaalde truc voor hoe dit wordt afgehandeld, maar ten eerste, als je MongoDB 2.6 of hoger beschikbaar hebt, kun je echt doen wat je wilt zonder $unwind
. Dit kan erg handig zijn voor de prestaties als u veel documenten verwerkt.
De belangrijkste operators hier zijn $map
die arrays op hun plaats verwerkt en de $allElementsTrue
operator die uw "resultaat" -velden zal evalueren. Het gebruik van "map" hier maakt het mogelijk om zowel de binnenste "tests"-array te testen om te zien waar de "result"-velden daar allemaal aan de werkelijke voorwaarde voldoen. In het geval van de buitenste array kan dit "resultaat" naar wens in die documenten worden geplaatst, en natuurlijk volgt de volledige evaluatie van het document dezelfde regels:
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"
}
}
}
}}
])
De manier om dit in eerdere versies te doen, vereist dat u $group
terug in twee stappen om de arrays te "herbouwen" terwijl de tests op die "resultaat" -velden opnieuw worden uitgevoerd. Het andere verschil hier is ook het gebruik van de $min
operator als false
wordt beschouwd als een lagere waarde dan true
en evalueert naar hetzelfde "allElements"-concept:
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"
}
}
}}
])