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

MongoDb पाइपलाइन एकत्रीकरण उप उप दस्तावेजों को छांटना

आप अपनी एकत्रीकरण पाइपलाइन की शुरुआत से ही गलती कर रहे हैं

$project: {
            "tasks" : 1
        }

जिससे आप अपना सारा डेटा खो देते हैं। तो सबसे पहले आपको इसे आरक्षित करने की आवश्यकता है:

$project: {
             tasks: 1,
             doc: {
                     title: "$title", 
                     order: "$order", 
                     description: "$description", 
                     status: "$status"
                  }
          }

बाद में अपना $अनविंड करें s जैसा आप अपने प्रश्न में करते हैं:

{$unwind: "$tasks"}, {$unwind: "$tasks.subTasks"}

फिर छँटाई करें। आपको मिश्रित कुंजियों के साथ छँटाई करने की आवश्यकता है, अन्यथा tasks.subTasks.order द्वारा क्रमित करना जैसे ही आप tasks.order . के आधार पर छाँटेंगे, होल्ड नहीं होगा . तो:

{$sort: {"tasks.order": -1, "tasks.subTasks.order": 1}}

और फिर कठिन हिस्सा आता है। आपको $group . की आवश्यकता है परिणामों को वापस करें, और पहला कदम $पुश . है उप-कार्य को वापस करें , लेकिन सबसे पहले, आपको फिर से कार्य विशेषताओं को संरक्षित करने की आवश्यकता है:

$project: {
             doc: 1, 
             task_id: "$tasks._id", 
             tasks_doc: {
                           title: "$tasks.title", 
                           description: "$tasks.description", 
                           order: "$tasks.order", 
                           status: "$tasks.status"
                        }, 
             subTasks: "$tasks.subTasks"
          }

...उपकार्य एकत्र करें :

$group: {
           _id: {
                   _id: "$_id", 
                   task_id: "$task_id", 
                   doc: "$doc", 
                   task_doc: "$tasks_doc"
                }, 
           subTasks: {
                        $push: "$subTasks"
                     }
        }

और वही कार्यों . के लिए . ध्यान दें कि $group . के दौरान आपको task_doc . को वापस प्रोजेक्ट करने की भी आवश्यकता है विशेषताएँ:

$group: {
           _id: {
                   _id: "$_id._id", 
                   doc: "$_id.doc"
                }, 
           tasks: {
                     $push: {
                               _id: "$_id.task_id", 
                               title: "$_id.task_doc.title", 
                               description: "$_id.task_doc.description",
                               order: "$_id.task_doc.order", 
                               status: "$_id.task_doc.status" 
                               subTasks: "$subTasks"
                            }
                  }
        }

और फिर रूट को वापस प्रोजेक्ट करें doc विशेषताएँ:

$project: {
             _id: "$_id._id", 
             title: "$_id.doc.title", 
             description: "$_id.doc.description", 
             order: "$_id.doc.order", 
             status: "$_id.doc.status", 
             tasks: 1
          }

मूल रूप से यही है। यहां पूरी कच्ची एकत्रीकरण पाइपलाइन है, ताकि आप परीक्षण कर सकें और देख सकें कि आपको वांछित परिणाम मिलता है या नहीं:

[
 {$match: {_id: ObjectId("554a13d4b692088a38f01f3b")}}, 
 {$project: {tasks: 1, doc: {title: "$title", order: "$order", description: "$description", status: "$status"}}}, 
 {$unwind: "$tasks"}, 
 {$unwind: "$tasks.subTasks"}, 
 {$sort: {"tasks.order": -1, "tasks.subTasks.order": 1}}, 
 {$project: {doc: 1, task_id: "$tasks._id", tasks_doc: {title: "$tasks.title", description: "$tasks.description", order: "$tasks.order", status: "$tasks.status"}, subTasks: "$tasks.subTasks"}}, 
 {$group: {_id: {_id: "$_id", task_id: "$task_id", doc: "$doc", task_doc: "$tasks_doc"}, subTasks: {$push: "$subTasks"}}}, 
 {$group: {_id: {_id: "$_id._id", doc: "$_id.doc"}, tasks: {$push: {_id: "$_id.task_id", title: "$_id.task_doc.title", description: "$_id.task_doc.description", order: "$_id.task_doc.order", status: "$_id.task_doc.status", subTasks: "$subTasks"}}}}, 
 {$project: {_id: "$_id._id", title: "$_id.doc.title", description: "$_id.doc.description", order: "$_id.doc.order", status: "$_id.doc.status", tasks: 1}}
]

अपडेट करें

यदि कोई सरणी फ़ील्ड खाली है या मौजूद नहीं है (null है) ) $अनविंड उस फ़ील्ड पर ऑपरेशन खाली परिणाम लौटाएगा . इस स्थिति का समाधान प्रारंभ में null . की स्थापना कर रहा है /खाली फ़ील्ड से कुछ शून्य मूल्य, उदा. "<खाली-सरणी>" . ध्यान दें, आपको यह करना है $project प्रत्येक सरणी के लिए आयन, उसके $अनविंड . से पहले ।

इस उत्तर पर एक नज़र डालें $ifNull . का उपयोग करने के तरीके के बारे में ऑपरेटर। $size भी देखें ऑपरेटर यहां

इस भाग से निपटने के बाद, आपको $group . की आवश्यकता है परिणामों को वापस करें, और इसे <का उपयोग करके प्राप्त किया जा सकता है। कोड>$cond ऑपरेटर , "<खाली-सरणी>" . के विरुद्ध जाँच करने के लिए मूल्य




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला के साथ पूर्णांक मान मान्य करें

  2. MongoDB में अल्फ़ान्यूमेरिक सॉर्ट कैसे करें?

  3. मोंगोडब में कई स्थितियों के साथ अद्यतन सरणी

  4. MongoDB - DBRef फ़ील्ड प्रकार से केवल $ref अपडेट कर रहा है

  5. मैं मोंगोडब से डेटाटाइम कैसे प्राप्त कर सकता हूं? jDateChosser Java के साथ डेटा की तुलना करके