MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

दूसरी नेस्टेड सरणी के भीतर संपत्ति को फ़िल्टर करने की परियोजना

चूंकि आपकी आवश्यकता केवल दस्तावेज़ को "प्रोजेक्ट" करने की है, इसलिए फ़ील्ड नकाबपोश है, हाँ एकत्रीकरण ढांचा ऐसा करने के लिए एक उपकरण है। सरणियों को खोलना और हालांकि पुनर्निर्माण करते समय प्रक्रिया के चारों ओर अपना सिर लाने में थोड़ा सा समय लगता है।

तो आप जो चाहते थे वह यह था:

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 ऑपरेशन सिर्फ क्षेत्र को हटाने के लिए। तो यह वास्तव में केवल "प्रक्षेपण" बन जाता है जिसकी आप अपेक्षा कर सकते हैं।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला अद्वितीय सत्यापन काम नहीं कर रहा। डुप्लीकेट प्रविष्टियां सहेजी जा रही हैं

  2. एक इंटीजर फ़ील्ड पर रेल मोंगोइड रेगेक्स

  3. डिबगिंग मानचित्र के लिए प्रिंट आउटपुट कैसे प्राप्त करें/मोंगोइड में कम करें?

  4. मोंगोडीबी। संग्रह में प्रत्येक दस्तावेज़ के लिए अद्वितीय संख्या निर्धारित करें

  5. नेवला:यदि तत्व पहले से संग्रहीत है तो सम्मिलित न करें