मोंगोडब में सरणी तत्व कैसे निकालें?


129

यहाँ सरणी संरचना है

contact: {
    phone: [
        {
            number: "+1786543589455",
            place: "New Jersey",
            createdAt: ""
        }
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }

    ]
}

यहाँ मैं केवल mongo id ( _id) और फ़ोन नंबर ( +1786543589455) जानता हूँ और मुझे दस्तावेज़ से उस पूरे संबंधित तत्व को निकालने की आवश्यकता है। फोन सरणी में शून्य शून्य अनुक्रमित तत्व फोन नंबर के साथ मेल खाता है और संबंधित सरणी तत्व को हटाने की जरूरत है।

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

मैंने निम्नलिखित अद्यतन विधि के साथ प्रयास किया

collection.update(
    { _id: id, 'contact.phone': '+1786543589455' },
    { $unset: { 'contact.phone.$.number': '+1786543589455'} }
);

लेकिन यह number: +1786543589455आंतरिक सरणी ऑब्जेक्ट से निकालता है, फोन सरणी में शून्य अनुक्रमित तत्व नहीं। pullबिना सफलता के भी प्रयास किया ।

मोंगोडब में सरणी तत्व कैसे निकालें?

जवाबों:


237

निम्नलिखित प्रश्न आज़माएं:

collection.update(
  { _id: id },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

यह दिए गए के साथ दस्तावेज़ ढूंढेगा _idऔर फोन +1786543589455को उसके contact.phoneसरणी से निकाल देगा ।

आप $unsetसरणी में मान को अनसेट करने के लिए उपयोग कर सकते हैं (इसे सेट करें null), लेकिन इसे पूरी तरह से हटाने के लिए नहीं।


3
धन्यवाद। यह अच्छा काम करता है। मैंने एक सफलता के साथ { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }और { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }बिना कोशिश की । क्या यहाँ के संचालकों को काम करने की समझ नहीं है?
जस्टिन जॉन

1
क्या इसके साथ कॉल बैक होता है?
ओलिवर डिक्सन

1
@iLoveUnicorns आप तीसरे तर्क के रूप में कॉलबैक जोड़ सकते हैं, या आप लौटे वादे का उपयोग कर सकते हैं।
लियोनिद बेस्चस्टानी

@LeonidBeschastny मैंने यह कोशिश की। मेरे मामले में, मेरे पास एक ही कुंजी के साथ कई दस्तावेज़ हैं। मैं इन सभी दस्तावेज़ों को $ खींचना चाहता हूं लेकिन वर्तमान क्वेरी केवल 1 दस्तावेज़ बदलती है और फिर रुक जाती है। मुझे क्या बदलाव चाहिए?
शुभम ए।

1
@ShubhamA। डिफ़ॉल्ट रूप से .update()एकल दस्तावेज़ को अद्यतन करता है। कई दस्तावेज़ों को अपडेट करने के लिए { multi: true }विकल्प का उपयोग करें । देखें db.collection.updateजानकारी के लिए डॉक्स
लियोनिद बेस्चस्टानी

14

यह नीचे कोड सरणी से पूर्ण ऑब्जेक्ट तत्व को हटा देगा, जहां फोन नंबर '+1786543589455' है

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);

4

नेवला में: से दस्तावेज़ :

दस्तावेज़ को उप-क्रम सरणी से निकालने के लिए हम किसी वस्तु को एक मेल खाते हुए पास कर सकते हैं।

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works

सही जवाब के लिए लियोनिद बेस्चस्टनी का जवाब देखें।


3

आप उप-दस्तावेज़ को निकालने के लिए बस $ पुल का उपयोग कर सकते हैं। $ पुल ऑपरेटर मौजूदा सरणी से एक मूल्य या मूल्यों के सभी उदाहरणों को हटाता है जो एक निर्दिष्ट स्थिति से मेल खाते हैं।

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

यह आपके माता-पिता को दिए गए आईडी के खिलाफ दस्तावेज मिलेगा और फिर उप-अंशांकन से तत्व को हटा देगा जो दिए गए मानदंडों से मेल खाता है।

पुल के बारे में और अधिक पढ़ें यहाँ


0

यदि आप Mongoose API का उपयोग करते हैं और सब-चाइल्ड ऑब्जेक्ट को खींचने के लिए देख रहे हैं: इस डॉक्यूमेंट को सहेजना () का उपयोग करना न भूलें, जब आप एडिटिंग कर लेते हैं अन्यथा डेटाबेस में बदलाव सेव नहीं होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.