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

MongoDb में पूर्वजों को पेड़ की संरचना का उपयोग करके प्राप्त करना

यह non-trivial है समाधान।

आवश्यकताएं

1 हमें अतिरिक्त फ़ील्ड जोड़ने की आवश्यकता है (चलिए इसे level कहते हैं) ) जो इंगित करता है कि पदानुक्रम के अंदर दस्तावेज़ कहाँ स्थित है।

|root        0
|-child A    1
|--child A_1 2
|-child B    1

2 हमें define करने की आवश्यकता है पहले पदानुक्रम गहराई (उदाहरण के लिए:अधिकतम 3)

सीमा

विशिष्ट स्तर से फ़िल्टर करने के लिए, हमें root . को संशोधित करने की आवश्यकता है और children $मिलान मान।

हमेशा पदानुक्रम स्तर सुनिश्चित करें:

root     - 0
children - 1

root     - 1
children - 2  

समाधान

db.documents.aggregate([
  {
    $facet: {
      root: [
        {
          $match: {
            level: 0
          }
        }
      ],
      children: [
        {
          $match: {
            level: 1
          }
        },
        {
          $graphLookup: {
            from: "documents",
            startWith: "$_id",
            connectFromField: "_id",
            connectToField: "parentId",
            maxDepth: 0,
            as: "hierarchy"
          }
        },
        {
          $sort: {
            _id: 1
          }
        }
      ]
    }
  },
  {
    $unwind: "$root"
  },
  {
    $project: {
      "root._id": 1,
      "root.name": 1,
      "root.level": 1,
      "root.hierarchy": {
        $filter: {
          input: "$children",
          as: "sub_level",
          cond: {
            $eq: [
              "$$sub_level.parentId",
              "$root._id"
            ]
          }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$root"
    }
  }
])

MongoPlayground (अधिकतम गहराई:3) | MongoPlayground (अधिकतम गहराई:4)

व्याख्या

  1. $facet . के साथ हम स्तर संरचना को परिभाषित करते हैं। root केवल सभी रूट निर्देशिका। children स्तर 1 + बच्चों के वंशज वाले सभी बच्चे शामिल हैं।

  2. हम $filter (मर्ज) रूट और बच्चे parentId . द्वारा

  3. $project . के साथ और $replaceRoot हम मूल संरचना लौटाते हैं।

लिंक्स

https://docs.mongodb.com/manual/reference/operator/ एकत्रीकरण/पहलू/
https://docs.mongodb.com/manual/ संदर्भ/संचालक/एकत्रीकरण/फ़िल्टर/
https://docs.mongodb.com/manual/ संदर्भ/संचालक/एकत्रीकरण/प्रतिस्थापन रूट/




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB किस स्तर पर लिखता है? (या:प्रति कनेक्शन से इसका क्या मतलब है

  2. Node.js + mongoose 100 से अधिक परिणाम मिलने पर फ़्रीज़ नोड ढूंढते हैं

  3. MongoDB के लिए PHP में आईएसओ दिनांक प्रारूप कैसे वापस करें?

  4. स्प्रिंग रिएक्टिवमोंगो रिपोजिटरी में मोनो के लिए सेव विधि क्यों नहीं है?

  5. DBRef के साथ MongoDB एकत्रीकरण