चूंकि आपकी आवश्यकता केवल दस्तावेज़ को "प्रोजेक्ट" करने की है, इसलिए फ़ील्ड नकाबपोश है, हाँ एकत्रीकरण ढांचा ऐसा करने के लिए एक उपकरण है। सरणियों को खोलना और हालांकि पुनर्निर्माण करते समय प्रक्रिया के चारों ओर अपना सिर लाने में थोड़ा सा समय लगता है।
तो आप जो चाहते थे वह यह था:
db.collection.aggregate([
{ "$unwind": "$questions" },
{ "$unwind": "$questions.answers" },
{ "$group": {
"_id": {
"_id": "$_id",
"name": "$name",
"description": "$description",
"qid": "$questions._id",
"question": "$questions.question"
},
"answers": {
"$push": {
"_id": "$questions.answers._id",
"answer": "$questions.answers.answer"
}
}
}},
{ "$project": {
"questions": {
"_id": "$_id.qid",
"question": "$_id.question",
"answers": "$answers"
}
}},
{ "$sort": { "_id": 1, "questions._id": 1 } },
{ "$group": {
"_id": "$_id._id",
"name": { "$first": "$_id.name" },
"description": { "$first": "$_id.description" },
"questions": { "$push": "$questions" }
}}
])
लेकिन वास्तव में, यदि आपके पास MongoDB 2.6 या इससे बड़ा संस्करण है तो आपको $अनविंड करें
और $group
उस क्षेत्र को छोड़ने के लिए परिणाम वापस एक साथ। अब आप इसे $project<का उपयोग करके कर सकते हैं /कोड>
और $map
ऑपरेटर जो सरणियों के साथ काम करता है:
db.collection.aggregate([
{ "$project": {
"name": 1,
"description": 1,
"questions": {
"$map": {
"input": "$questions",
"as": "q",
"in": {
"$ifNull": [
{
"_id": "$$q._id",
"question": "$$q.question",
"answers": {
"$map": {
"input": "$$q.answers",
"as": "el",
"in": {
"$ifNull": [
{ "_id": "$$el._id", "answer": "$$el.answer" },
false
]
}
}
}
},
false
]
}
}
}
}}
])
इंडेंटेशन के लिए खेद है कि पृष्ठ को थोड़ा वहां से स्क्रॉल किया जा रहा है, लेकिन तुलना करके इसे पढ़ना अभी भी आसान है।
पहला $map
प्रश्न सरणी को जगह में संसाधित करता है और एक आंतरिक $नक्शा
जो "isCorrectAnswer" फ़ील्ड के बिना आंतरिक उत्तर सरणी दस्तावेज़ लौटाता है। यह तत्वों का प्रतिनिधित्व करने के लिए अपने स्वयं के चर का उपयोग करता है, और $ifNull
में सिर्फ इसलिए है क्योंकि <का "इन" भाग कोड>$नक्शा
ऑपरेटर उन तत्वों में से प्रत्येक पर एक शर्त का मूल्यांकन करने की अपेक्षा करता है।
कुल मिलाकर थोड़ा तेज़, क्योंकि आपको $अनविंड करें
और $group
ऑपरेशन सिर्फ क्षेत्र को हटाने के लिए। तो यह वास्तव में केवल "प्रक्षेपण" बन जाता है जिसकी आप अपेक्षा कर सकते हैं।