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

कुल $लुकअप तत्वों के मूल सरणी क्रम को वापस नहीं करता है

यह $lookup . का "डिज़ाइन द्वारा" है कार्यान्वयन। क्या वास्तव में होता है "हुड के नीचे" MongoDB है आंतरिक $lookup . में तर्कों को रूपांतरित करता है नए अभिव्यंजक . के लिए $expr . का उपयोग करके प्रारूपित करें और $in . यहां तक ​​कि इससे पहले के संस्करणों में भी जब यह अभिव्यंजक प्रपत्र लागू किया गया था, एक "मानों की सरणी" . के लिए आंतरिक यांत्रिकी वास्तव में बहुत कुछ वैसा ही था।

यहां समाधान यह है कि "शामिल हुए" को पुन:क्रमित करने के लिए मूल सरणी की एक प्रति को संदर्भ के रूप में बनाए रखा जाए आइटम:

collection.aggregate([
  {"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
  {"$lookup": {
    "from": "collection2",
    "let": { "classIds": "$Classes.ID" },
    "pipeline": [
      { "$match": {
        "$expr": { "$in": [ "$_id", "$$classIds" ] }
      }},
      { "$addFields": {
        "sort": {
          "$indexOfArray": [ "$$classIds", "$_id" ]
        }
      }},
      { "$sort": { "sort": 1 } },
      { "$addFields": { "sort": "$$REMOVE" }}
    ],
    "as": "results"
  }}
])

या विरासत $lookup . द्वारा उपयोग:

collection.aggregate([
  {"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
  {"$lookup": {
    "from": "collection2",
    "localField": "Classes.ID",
    "foreignField": "_id",
    "as": "results"
  }},
  { "$unwind": "$results" },
  { "$addFields": {
    "sort": {
      "$indexOfArray": [ "$Classes.ID", "$results._id" ]
    }
  }},
  { "$sort": { "_id": 1, "sort": 1 } },
  { "$group": {
    "_id": "$_id",
    "Name": { "$first": "$Name" },
    "Classes": { "$first": "$Classes" },
    "results": { "$push": "$results" }
  }}
])

दोनों वेरिएंट एक ही आउटपुट देते हैं:

{
        "_id" : ObjectId("5c781752176c512f180048e3"),
        "Name" : "Pedro",
        "Classes" : [
                {
                        "ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
                },
                {
                        "ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
                },
                {
                        "ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
                }
        ],
        "results" : [
                {
                        "_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
                        "variable1" : "B"
                },
                {
                        "_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
                        "variable1" : "C"
                },
                {
                        "_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
                        "variable1" : "A"
                }
        ]
}

$indexOfArray . का उपयोग करने की सामान्य अवधारणा _id . की तुलना में "शामिल हुए" . से मान सामग्री खोजने के लिए यह "सूचकांक" . है "$Classes.ID" . से मूल स्रोत सरणी में स्थिति . अलग $lookup आप इस प्रतिलिपि तक कैसे पहुंच सकते हैं, इसके लिए सिंटैक्स वेरिएंट के अलग-अलग दृष्टिकोण हैं और आप मूल रूप से कैसे पुनर्निर्माण करते हैं।

$sort बेशक वास्तविक दस्तावेज़ों का क्रम सेट करता है, या तो पाइपलाइन प्रसंस्करण के अंदर अभिव्यंजक रूप के लिए, या $unwind . के खुले दस्तावेज़ों के माध्यम से . जहां आपने $unwind . का उपयोग किया है तब आप $group मूल दस्तावेज़ फ़ॉर्म पर वापस जाएँ।

<ब्लॉककोट>

नोट :यहां उपयोग के उदाहरण $indexOfArray . के लिए MongoDB 3.4 पर निर्भर करते हैं कम से कम और $$REMOVE अभिव्यंजक . के रूप में MongoDB 3.6 के साथ संरेखित करता है $lookup

पूर्व रिलीज के लिए सरणी को फिर से ऑर्डर करने के अन्य तरीके हैं, लेकिन इन्हें मोंगोडीबी के $ इन क्लॉज गारंटी ऑर्डर पर अधिक विस्तार से प्रदर्शित किया गया है। वास्तविक रूप से न्यूनतम न्यूनतम जो आपको वर्तमान में एक उत्पादन MongoDB संस्करण के रूप में चलाना चाहिए वह 3.4 रिलीज़ है।

देखें समर्थन नीति MongoDB सर्वर के अंतर्गत समर्थित रिलीज़ और समाप्ति तिथियों के पूर्ण विवरण के लिए।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. घातक त्रुटि - 'मोंगो' वर्ग नहीं मिला

  2. नेवला के साथ कस्टम त्रुटि संदेश

  3. कैसे जांचें कि कोई सरणी फ़ील्ड MongoDB में किसी अन्य सरणी का हिस्सा है या नहीं?

  4. जब फ़ील्ड का बड़ा संयोजन मौजूद है तो MongoDB में अनुक्रमणिका का सही तरीका क्या है?

  5. मोंगोडब समूह और सॉर्ट