Mongoose का उपयोग करके एक MongoDB दस्तावेज़ से एक कुंजी हटाएँ


103

मैं नोड के साथ MongoDB तक पहुँचने के लिए Mongoose लाइब्रेरी का उपयोग कर रहा हूँ

क्या एक दस्तावेज़ से एक कुंजी को हटाने का एक तरीका है ? यानी न केवल मान को शून्य करने के लिए सेट करें, बल्कि इसे हटा दें?

User.findOne({}, function(err, user){
  //correctly sets the key to null... but it's still present in the document
  user.key_to_delete = null;

  // doesn't seem to have any effect
  delete user.key_to_delete;

  user.save();
});

1
मुझे लगा कि मुझे मिल गया है, लेकिन कुछ परीक्षणों के बाद: शायद नहीं। हालांकि इस विषय पर इसकी कुछ अच्छी चर्चा है। group.google.com/group/mongoose-orm/browse_thread/thread/…
स्टीफन

LOL कोई बात नहीं, मुझे लगता है कि यह आपकी पोस्ट थी!
स्टीफन

जवाबों:


168

शुरुआती संस्करणों में, आपको नोड-मोंगोडब-देशी ड्राइवर को छोड़ने की आवश्यकता होगी। प्रत्येक मॉडल में एक संग्रह ऑब्जेक्ट होता है जिसमें सभी तरीके होते हैं जो नोड-मोंगोडब-देशी प्रदान करते हैं। तो आप इस पर कार्रवाई कर सकते हैं:

User.collection.update({_id: user._id}, {$unset: {field: 1 }});

संस्करण 2.0 के बाद से आप कर सकते हैं:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);

और संस्करण 2.4 के बाद से, यदि आपके पास एक मॉडल का उदाहरण है जो आप पहले से ही कर सकते हैं:

doc.field = undefined;
doc.save(callback);

यह Mongoose 2.X में तय किया गया है, इसलिए आप संग्रह को छोड़ सकते हैं।
staackuser2

4
या तो उपयोग करें User.update({ _id: id }, { $unset: { field: 1 }}, callback)या यदि आपके पास कोई दस्तावेज़ उदाहरण है, तो अपरिभाषित करने के लिए पथ सेट करें और फिर इसे सहेजें:doc.field = undefined; doc.save()
aaronheckmann

25
बस ध्यान दें कि यदि आप एक पुरानी संपत्ति को हटाने की कोशिश कर रहे हैं जो अब आपके स्कीमा में परिभाषित नहीं है, तो आपको करने की आवश्यकता हैdoc.set('field', undefined)
बुराईलॉस्क्री

3
हटाने के बारे में क्या doc.field.foo?
चॉवी

28
@ilcelery doc.set('field', undefined)पर्याप्त नहीं हो सकती क्योंकि सख्त मोड (डिफ़ॉल्ट) उन फ़ील्ड्स को सेट करने की अनुमति नहीं देता है जो स्कीमा में अब नहीं हैं। doc.set('field', undefined, { strict: false })ठीक काम किया।
अलेक्जेंडर लिंक

56

आप यह करना चाहते हैं:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});

3
यह सिर्फ इसे शून्य करने के लिए सेट करेगा - न कि ओपी क्या पूछ रहा है।
इयान हेनरी

25
2.4.0 संस्करण के रूप में अपरिभाषित करने के लिए एक डॉक्यूमेंट कुंजी सेट करना $ unset को mongodb aaronheckmann.posterous.com/mongoose-240
James Moore

30

मैं मानसून का उपयोग करता हूं और उपरोक्त कार्यों में से किसी का उपयोग करने से मुझे आवश्यकता हुई। फ़ंक्शन त्रुटि मुक्त संकलन करता है, लेकिन फ़ील्ड अभी भी बना रहेगा।

user.set('key_to_delete', undefined, {strict: false} );

मेरे लिए चाल चली।


इस उपयोगी उत्तर को अपवित्र करते हुए, बहुत बुरा @ अलेक्जेंडर-लिंक ने इसे 2015 में वापस उत्तर नहीं दिया ( stackoverflow.com/questions/4486926/… )
w00t

1
आपके उत्तर के लिए धन्यवाद, मेरे लिए, अन्य समाधान सरणियों में निहित वस्तुओं के लिए काम नहीं किया!
बेन्सवर

@BenSower यह मेरा मामला भी था। केवल इस समाधान ने अच्छी तरह से काम किया, क्योंकि मुझे एक विशिष्ट दस्तावेज़ की आईडी खोजने के बाद सरणी के साथ एक फ़ील्ड को हटाना पड़ा
लुइस फित्रो

ध्यान दें कि स्ट्रिंग कुंजी का एक मार्ग है। इसलिए, यदि आप जिस ऑब्जेक्ट को हटाना चाहते हैं, वह नेस्टेड है, तो आपको उसे पथ करना होगा। इस जवाब ने मेरी समस्या हल कर दी!
ब्रैड्यो

8

Mongo सिंटैक्स में कुछ कुंजी को हटाने के लिए जो आपको करने की आवश्यकता है:

{ $unset : { field : 1} }

मानगो में ही लगता है।

संपादित करें

इस उदाहरण की जाँच करें


क्या आप इस उत्तर को स्पष्ट कर सकते हैं और एक कोड उदाहरण दे सकते हैं जो उपरोक्त उदाहरण कोड से संबंधित है?
डैनियल बियर्ड्सले

क्षमा करें, लेकिन मुझे मानस में विस्तार नहीं दिया गया है। सिंटैक्स के ऊपर यह मैंगो सिंटैक्स है, इसलिए मुझे लगता है कि किसी भी भाषा के लिए ड्राइवर इसका समर्थन करता है। मुझे कुछ उदाहरण मिला, मेरे उत्तर में इसे जांचें।
एंड्रयू ओर्शिच

1

क्या यह उपयोग करने की तरह एक साइड समस्या हो सकती है

function (user)

के बजाय

function(err, user)

खोजने के लिए कॉलबैक? बस इसके साथ मदद करने की कोशिश कर रहा हूं क्योंकि मेरे पास पहले से ही मामला था।


1

Mongoose डॉक्यूमेंट एक सादा जावास्क्रिप्ट ऑब्जेक्ट नहीं है और इसीलिए आप डिलीट ऑपरेटर का उपयोग नहीं कर सकते हैं। (या unset'लॉज' लाइब्रेरी से)।

आपके विकल्प doc.path = null सेट करने के लिए हैं || अपरिभाषित या डॉक्यूमेंट को हटाने के लिए Document.toObject () विधि का उपयोग करके मैंगोज़ डॉक को सादे ऑब्जेक्ट में बदल दें और वहाँ से हमेशा की तरह उपयोग करें। मोंगोज़ो अपी-रेफ में और पढ़ें: http://mongoosejs.com/docs/api.html#document_Document-toObject

उदाहरण कुछ इस तरह दिखाई देगा:

User.findById(id, function(err, user) {
    if (err) return next(err);
    let userObject = user.toObject();
    // userObject is plain object
});


0

इन सभी उत्तरों के साथ समस्या यह है कि वे एक क्षेत्र के लिए काम करते हैं। उदाहरण के लिए मान लें कि मैं अपने दस्तावेज़ से सभी फ़ील्ड हटाना चाहता हूँ अगर वे एक खाली स्ट्रिंग थे ""। पहले आपको यह देखना चाहिए कि फ़ील्ड खाली स्ट्रिंग है या नहीं $unset:

function unsetEmptyFields(updateData) {
  const $unset = {};
  Object.keys(updatedData).forEach((key) => {
    if (!updatedData[key]) {
      $unset[key] = 1;
      delete updatedData[key];
    }
  });
  updatedData.$unset = $unset;

  if (isEmpty(updatedData.$unset)) { delete updatedData.$unset; }

  return updatedData;
}

function updateUserModel(data){
const updatedData = UnsetEmptyFiled(data);

    const Id = "";
    User.findOneAndUpdate(
      { _id: Id },
      updatedData, { new: true },
    );
}


0

यदि आप संग्रह से एक कुंजी निकालना चाहते हैं तो इस विधि को आजमाएँ। यह मेरे लिए काम किया

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);

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