これを処理する方法には特定のトリックがありますが、最初にMongoDB 2.6以降を使用できる場合は、 $ unwind
。これは、大量のドキュメントを処理している場合にパフォーマンスに非常に役立ちます。
ここでの主要な演算子は、 $ map
>
配列を適切に処理し、 $ allElementsTrue
「結果」フィールドを評価する演算子。ここでの「map」の使用により、内部の「tests」配列の両方のテストで、そこにある「result」フィールドがすべて真の条件を満たす場所を確認できます。外側の配列の場合、この「結果」は必要に応じてこれらのドキュメントに配置できます。もちろん、ドキュメントの完全な評価は同じルールに従います。
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"
}
}
}
}}
])
以前のバージョンでこれを行うには、 $ group
これらの「結果」フィールドでテストを再度実行しながら、アレイを「再構築」するために、2つのステップに戻ります。ここでの他の違いは、 $minを使用することです。
false
としての演算子 true
よりも小さい値と見なされます 同じ「allElements」の概念に基づいて評価します:
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"
}
}
}}
])