MongoDB दस्तावेज़ से किसी फ़ील्ड को पूरी तरह से कैसे निकालें?


307
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

मान लीजिए यह एक दस्तावेज है। मैं wordsइस संग्रह के सभी दस्तावेजों से पूरी तरह से कैसे " " हटा सकता हूं ? मैं चाहता हूं कि सभी दस्तावेज " words" के बिना हों :

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

जवाबों:


531

इसे आज़माएँ: यदि आपका संग्रह 'उदाहरण' था

db.example.update({}, {$unset: {words:1}}, false, true);

इसे देखें:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

अद्यतन :

उपरोक्त लिंक अब $ unset'ing को कवर नहीं करता है। {multi: true}यदि आप संग्रह में सभी दस्तावेजों से इस क्षेत्र को हटाना चाहते हैं तो जोड़ना सुनिश्चित करें ; अन्यथा, यह केवल पहले दस्तावेज़ से इसे हटा देगा जो इसे मेल खाता है। अद्यतन किए गए दस्तावेज़ों के लिए इसे देखें:

https://docs.mongodb.com/manual/reference/operator/update/unset/

उदाहरण:

db.example.update({}, {$unset: {words:1}} , {multi: true});

1
इस सवाल का हल झूठे के विवरण के लिए / सच देखें stackoverflow.com/questions/7714216/...
Dsel

1
इस पृष्ठ पर कहीं भी एक "निक
कॉटरेल

6
क्या मुझे कुछ याद आ रहा है, या यह 8+ वर्षों से गलत है, क्योंकि tags.wordsहोना चाहिए $unset, नहीं words? सल्वाडोर डाली का जवाब भी देखें।
दान डस्केल्सस्कु

1
तुम भी उपयोग कर सकते हैं updateManyके बजाय {multi:true}, यानीdb.example.updateMany({},{"$unset":{words:""}})
किप

158

शुरुआत में, मुझे यह नहीं मिला कि प्रश्न में एक उछाल क्यों है (मुझे लगा कि प्रश्न का एक अच्छा उत्तर है और जोड़ने के लिए कुछ भी नहीं है), लेकिन फिर मैंने देखा कि जो उत्तर स्वीकार किया गया था और 15 बार उखाड़ा गया था, वह वास्तव में गलत था!

हां, आपको $unsetऑपरेटर का उपयोग करना होगा , लेकिन यह परेशान उन कुंजी शब्दों को हटाने जा रहा है जो किसी संग्रह के लिए दस्तावेज़ के लिए मौजूद नहीं हैं। तो मूल रूप से यह कुछ नहीं करेगा।

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

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

बस पूरा करने के लिए, मैं इसे करने के दूसरे तरीके का उल्लेख करूंगा , जो कि बहुत बुरा है, लेकिन इस तरह से आप किसी भी कस्टम कोड के साथ फ़ील्ड बदल सकते हैं (यहां तक ​​कि इस दस्तावेज़ से किसी अन्य फ़ील्ड के आधार पर)।


2
इसके अलावा, यदि टैग एक सरणी है तो यह इस तरह होगा: db.example.update ({}, {$ unset: {'tags। $ []। शब्द': 1}}, गलत, सत्य)
Manan शाह

21
db.example.updateMany({},{"$unset":{"tags.words":1}})

हम कई दस्तावेजों को अपडेट करने के लिए भी इसका उपयोग कर सकते हैं।


2
मुझे यह स्पष्ट है false, trueकि पिछले दो आर्गनों से गुजरने की तुलना मेंupdate()
किप

17

MongoDB में फ़ील्ड को हटाने या हटाने के लिए

  • एकल रिकॉर्ड के लिए

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • मल्टी रिकॉर्ड के लिए

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

2

मैं इसके समान कुछ करने की कोशिश कर रहा था, लेकिन एक एम्बेडेड दस्तावेज़ से कॉलम को हटा दें। इसका हल ढूंढने में मुझे थोड़ा समय लगा और यह पहली पोस्ट थी, जिसके बारे में मुझे पता चला, तो मैंने सोचा कि मैं इसे किसी और के लिए भी पोस्ट करूंगा।

तो कहने दें कि इसके बजाय आपका डेटा इस तरह दिखता है:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

wordsएम्बेडेड दस्तावेज़ से कॉलम को निकालने के लिए , यह करें:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

या का उपयोग कर updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

$unsetकेवल इसे संपादित होगा यदि मान मौजूद है, लेकिन यह एक सुरक्षित नेविगेशन काम नहीं चलेगा (यदि यह जाँच नहीं होते tagsपहले से मौजूद है) तो मौजूद है एम्बेडेड दस्तावेज़ पर की जरूरत है।

यह सभी स्थितीय ऑपरेटर ( $[]) का उपयोग करता है जिसे संस्करण 3.6 में पेश किया गया था


1

डिफ़ॉल्ट रूप से, अद्यतन () विधि एकल दस्तावेज़ को अपडेट करती है। क्वेरी मापदंड से मेल खाने वाले सभी दस्तावेज़ों को अपडेट करने के लिए मल्टी पैरामीटर सेट करें।

संस्करण 3.6 में बदला गया। वाक्य - विन्यास :

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

उदाहरण :

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

आपके उदाहरण में:

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})

1

शुरू करना Mongo 4.2, थोड़ा अलग सिंटैक्स का उपयोग करना भी संभव है:

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }

अद्यतन विधि भी एक एकत्रीकरण पाइपलाइन स्वीकार कर सकते हैं (एक एकत्रीकरण पाइप लाइन के उपयोग वाचक वर्ग कोष्ठक ध्यान दें)।

इसका मतलब है कि $unsetउपयोग किया जा रहा ऑपरेटर एक एकत्रीकरण एक है ( "क्वेरी" एक के विपरीत ), जिसका सिंटैक्स फ़ील्ड की एक सरणी लेता है।



0

और मोंगोमापर के लिए,

  • दस्तावेज़: शटऑफ़
  • हटाने के लिए फ़ील्ड: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )


0

क्योंकि मैं इस पृष्ठ को खोज रहा था जब MongoEngine का उपयोग करके किसी फ़ील्ड को निकालने का तरीका खोज रहा था, मुझे लगता है कि यह MongoEngine तरीके को यहां भी पोस्ट करने में मददगार हो सकता है:

Example.objects.all().update(unset__tags__words=1)

-2

{नाम: 'पुस्तक', टैग: {शब्द: ['एबीसी', '123'], अव्यक्त: 33, लंबा: 22}}

उत्तर:

db.tablename.remove ({ 'tags.words': [ 'एबीसी', '123']})


-3

जाँच करना कि क्या "शब्द" मौजूद है और फिर दस्तावेज़ से हटाया जा रहा है

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

सच इंगित करता है कि मिलान होने पर कई दस्तावेज़ अपडेट करें।


आपको अस्तित्व की जाँच करने की आवश्यकता नहीं है। प्रलेखन राज्यों है कि: "क्षेत्र अस्तित्व में नहीं है, तो $ सेट किए बिना कुछ भी नहीं है (यानी कोई आपरेशन) करता है।"
डैन डस्केल्सस्कु

-4

आप 3.4 पर प्रोजेक्ट का उपयोग करके एकत्रीकरण में भी ऐसा कर सकते हैं

{$ परियोजना: {"tags.words": 0}}


-7

एक पैकेज को संदर्भित करने और विभिन्न "कुंजियों" को हटाने के लिए, यह प्रयास करें

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.