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

एक्सप्रेस और मोंगो के साथ पुनरावर्ती तालिका के साथ नोड ट्री बनाएं

आप $graphLookup का उपयोग कर सकते हैं और अन्य उपयोगी सरणी ऑपरेटर,

  • $match फ़िल्टर जिसमें रिकॉर्ड केवल parent_id है null है
  • $graphLookup बाल रिकॉर्ड और गहराई संख्या को गहराई में प्राप्त करने के लिए level
  • $unwind डीकंस्ट्रक्ट children सरणी और खाली बच्चों को न निकालने दें
  • $sort गहराई स्तर फ़ील्ड द्वारा level अवरोही क्रम में
  • $group id . द्वारा फ़ील्ड और पुनर्निर्माण children सरणी
db.collection.aggregate([
  { $match: { parent_id: null } },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$id",
      connectFromField: "id",
      connectToField: "parent_id",
      depthField: "level",
      as: "children"
    }
  },
  {
    $unwind: {
      path: "$children",
      preserveNullAndEmptyArrays: true
    }
  },
  { $sort: { "children.level": -1 } },
  {
    $group: {
      _id: "$id",
      parent_id: { $first: "$parent_id" },
      name: { $first: "$name" },
      type: { $first: "$type" },
      category: { $first: 1 },
      children: { $push: "$children" }
    }
  },
  • $addFields अब नेस्टेड स्तर के बच्चों को ढूंढें और इसके स्तर पर आवंटित करें,
    • $children के लूप को पुनरावृत्त करने के लिए कम करें सरणी।
    • डिफ़ॉल्ट फ़ील्ड को प्रारंभ करें level डिफ़ॉल्ट मान -1 है, presentChild है [], prevChild है [] शर्तों के उद्देश्य के लिए
    • $let फ़ील्ड प्रारंभ करने के लिए:
      • prev शर्त के अनुसार यदि दोनों level बराबर हैं तो वापसी prevChild अन्यथा presentChild return लौटाएं
      • current शर्त के अनुसार यदि दोनों level बराबर हैं तो वापसी presentChild अन्यथा []
    • in level लौटाने के लिए फ़ील्ड और prevChild आरंभिक फ़ील्ड से फ़ील्ड
      • presentChild $filter children prev . से सरणी और वापसी, वर्तमान वस्तुओं को children . के साथ मर्ज करें $mergeObjects . का उपयोग करके सरणी और current . के साथ संक्षिप्त करें $concatArrays . का उपयोग करने की सरणी
  • $addFields केवल presentChild return लौटाने के लिए सरणी क्योंकि हमें केवल उस संसाधित सरणी की आवश्यकता है
  {
    $addFields: {
      children: {
        $reduce: {
          input: "$children",
          initialValue: { level: -1, presentChild: [], prevChild: [] },
          in: {
            $let: {
              vars: {
                prev: {
                  $cond: [
                    { $eq: ["$$value.level", "$$this.level"] },
                    "$$value.prevChild",
                    "$$value.presentChild"
                  ]
                },
                current: {
                  $cond: [{ $eq: ["$$value.level", "$$this.level"] }, "$$value.presentChild", []]
                }
              },
              in: {
                level: "$$this.level",
                prevChild: "$$prev",
                presentChild: {
                  $concatArrays: [
                    "$$current",
                    [
                      {
                        $mergeObjects: [
                          "$$this",
                          {
                            children: {
                              $filter: {
                                input: "$$prev",
                                as: "e",
                                cond: { $eq: ["$$e.parent_id", "$$this.id"] }
                              }
                            }
                          }
                        ]
                      }
                    ]
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $addFields: {
      id: "$_id",
      children: "$children.presentChild"
    }
  }
])

खेल का मैदान




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

  2. MongoDB दस्तावेज़ में विशेष वर्णों के साथ स्ट्रिंग खोजना

  3. mongorestore स्टैंडअलोन से रेप्लिकासेट तक

  4. MongoDB और NodeJS के साथ एक विशिष्ट तिथि के लिए क्वेरी

  5. कनेक्ट-मोंगो मोंगोस्टोर सत्र वास्तव में कैसे सहेजे जाते हैं?