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

Mongodb पुनरावर्ती क्वेरी $graphLookup . के साथ अपेक्षित रूप से काम नहीं कर रही है

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

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

खेल का मैदान




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. बाहरी इंजेक्शन हमलों से MongoDB को सुरक्षित करना

  2. नेवला में स्थान, mongoDB

  3. क्या एग्रीगेशन फ्रेमवर्क मोंगो में प्रक्षेपण के क्रम में फ़ील्ड प्राप्त करना संभव है?

  4. MongoDB में स्ट्रिंग दिनांक को ISO दिनांक में बदलें?

  5. फ़ील्डपाथ फ़ील्ड नामों में '.' नहीं हो सकता है AGGREGATE का उपयोग करने का प्रयास करते समय