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

MongoDB में किसी सरणी में किसी आइटम का एक उदाहरण कैसे खींचें?

तो आप इसमें सही हैं $pull ऑपरेटर ठीक वही करता है जो दस्तावेज कहता है कि यह तर्क वास्तव में एक "क्वेरी" है जिसका उपयोग उन तत्वों से मेल खाने के लिए किया जाता है जिन्हें हटाया जाना है।

यदि आपकी सरणी सामग्री हमेशा "पहली" स्थिति में होती है जैसा कि आप दिखाते हैं तो $pop ऑपरेटर वास्तव में उस पहले तत्व को हटा देता है।

मूल नोड ड्राइवर के साथ:

collection.findOneAndUpdate(
    { "array.0": "bird" },       // "array.0" is matching the value of the "first" element 
    { "$pop": { "array": -1 } },
    { "returnOriginal": false },
    function(err,doc) {

    }
);

नेवला के साथ संशोधित दस्तावेज़ वापस करने का तर्क अलग है:

MyModel.findOneAndUpdate(
    { "array.0": "bird" },
    { "$pop": { "array": -1 } },
    { "new": true },
    function(err,doc) {

    }
);

लेकिन अगर "पहले" आइटम को हटाने के लिए सरणी की स्थिति ज्ञात नहीं है, तो दोनों में से किसी का भी अधिक उपयोग नहीं होता है।

यहां सामान्य दृष्टिकोण के लिए आपको "दो" अपडेट की आवश्यकता होती है, पहले आइटम से मेल खाने के लिए एक होने के नाते और इसे हटाने के लिए अद्वितीय कुछ के साथ प्रतिस्थापित किया जाता है, और दूसरा वास्तव में उस संशोधित आइटम को हटाने के लिए होता है।

यह बहुत अधिक सरल है यदि साधारण अपडेट लागू करना और लौटाए गए दस्तावेज़ के लिए नहीं पूछना है, और यह सभी दस्तावेज़ों में थोक में भी किया जा सकता है। यह आपके कॉल को नेस्ट करने से बचने के लिए async.series जैसी किसी चीज़ का उपयोग करने में भी मदद करता है:

async.series(
    [
        function(callback) {
            collection.update(
                { "array": "bird" },
                { "$unset": { "array.$": "" } },
                { "multi": true }
                callback
            );
        },
       function(callback) {
           collection.update(
                { "array": null },
                { "$pull": { "array": null } },
                { "multi": true }
                callback
           );
       }
    ],
    function(err) {
       // comes here when finished or on error   
    }
);

तो $unset . का उपयोग करके यहाँ स्थितीय $ . के साथ ऑपरेटर "पहले" आइटम को null . में बदलने की अनुमति देता है . फिर $pull . के साथ अगली क्वेरी बस किसी भी null को हटा देता है सरणी से प्रविष्टि।

इस प्रकार आप किसी सरणी से किसी मान के "पहले" अवसर को सुरक्षित रूप से हटा देते हैं। यह निर्धारित करने के लिए कि क्या उस सरणी में एक से अधिक मान हैं जो समान हैं, हालांकि एक और प्रश्न है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. यूनिट परीक्षण के लिए मॉक मोंगोडीबी सर्वर का प्रयोग करें

  2. ऐसे दस्तावेज़ खोजें जिनके सरणी फ़ील्ड में किसी दिए गए सरणी के कम से कम n तत्व हों

  3. नेवला:ObjectId तुलना असंगत रूप से विफल हो जाती है

  4. स्थिति से मेल खाने वाले सरणी तत्वों की गणना करें

  5. डॉकर का उपयोग करके MongoDB को तैनात करना