इसे कैसे संभाला जाता है, इसके लिए एक विशेष तरकीब है, लेकिन सबसे पहले यदि आपके पास MongoDB 2.6 या इससे अधिक उपलब्ध है तो आप $unwind
. यदि आप बहुत सारे दस्तावेज़ संसाधित कर रहे हैं तो यह प्रदर्शन के लिए बहुत उपयोगी हो सकता है।
यहां प्रमुख ऑपरेटर हैं $map
जो सरणी को जगह में संसाधित करता है और $allElementsTrue
ऑपरेटर जो आपके "परिणाम" फ़ील्ड का मूल्यांकन करेगा। यहां "मानचित्र" का उपयोग आंतरिक "परीक्षण" सरणी के दोनों परीक्षणों को यह देखने की अनुमति देता है कि वहां "परिणाम" फ़ील्ड सभी सही स्थिति को पूरा करते हैं। बाहरी सरणी मामले में, यह "परिणाम" उन दस्तावेज़ों में रखा जा सकता है जिनकी आपको आवश्यकता है, और निश्चित रूप से दस्तावेज़ के लिए पूर्ण मूल्यांकन समान नियमों का पालन करता है:
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
दो चरणों में वापस उन "परिणाम" फ़ील्ड पर परीक्षण करते समय सरणियों को "पुनर्निर्माण" करने के लिए। यहां दूसरा अंतर $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"
}
}
}}
])