MongoDB: एक ही आदेश के साथ कई दस्तावेज़ कैसे अपडेट करें?


145

मुझे यह जानकर आश्चर्य हुआ कि निम्न उदाहरण कोड केवल एक ही दस्तावेज़ को अद्यतन करता है:

> db.test.save({"_id":1, "foo":"bar"});
> db.test.save({"_id":2, "foo":"bar"});

> db.test.update({"foo":"bar"}, {"$set":{"test":"success!"}});

> db.test.find({"test":"success!"}).count();
1

मुझे पता है कि मैं तब तक लूप कर सकता हूं और तब तक अपडेट करता रह सकता हूं जब तक कि वे सब बदल न जाएं, लेकिन यह बहुत ही अक्षम है। क्या कोई बेहतर तरीका है?

जवाबों:


247

मल्टी अपडेट को हाल ही में जोड़ा गया था, इसलिए यह केवल विकास रिलीज़ (1.1.3) में उपलब्ध है। शेल से आप trueचौथे तर्क के रूप में पास करके एक बहु अद्यतन करते हैं update(), जहाँ तीसरा तर्क उक्ति तर्क है:

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, false, true);

Mongodb 2.2+ के संस्करणों के लिए आपको एक साथ कई दस्तावेज़ों को अपडेट करने के लिए विकल्प को सही पर सेट करने की आवश्यकता है।

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})

Mongodb 3.2+ के संस्करणों के लिए, आप updateMany()अलग-अलग multiविकल्प की आवश्यकता के बिना, एक साथ कई दस्तावेज़ों को अद्यतन करने के लिए नई विधि का उपयोग कर सकते हैं ।

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})

3
मुझे यकीन नहीं है कि यह परिवर्तन कब हुआ था, लेकिन Mongodb v2.2.2 यह थोड़ा अलग तरीके से करता है। db.collection.update (<क्वेरी>, <अपडेट>, <विकल्प>) जहां विकल्प कुंजी मूल्य जोड़े का एक सेट है। प्रलेखन देखें: docs.mongodb.org/manual/applications/update
TechplexEngineer 15

3
क्या होगा अगर मैं अलग-अलग दस्तावेज़ों के लिए अलग-अलग मान सेट करना चाहता हूं? क्या ऐसा करने का कोई तरीका है?
zach

ओल्डवेल्यू + "कुछ स्ट्रिंग" के लिए यह कैसे करें
महेश के

34

V3.3 में शुरू करके आप अपडेटमनी का उपयोग कर सकते हैं

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

V2.2 में, अद्यतन फ़ंक्शन निम्न रूप लेता है:

 db.collection.update(
   <query>,
   <update>,
   { upsert: <boolean>, multi: <boolean> }
)

https://docs.mongodb.com/manual/reference/method/db.collection.update/


16

के लिए मोंगो संस्करण> 2.2 , एक क्षेत्र बहु जोड़ सकते हैं और सच के लिए सेट

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })

7

मैंने एक बेहतर इंटरफ़ेस के साथ ऐसा करने का एक तरीका बनाया है।

  • db.collection.find({ ... }).update({ ... }) - बहु अद्यतन
  • db.collection.find({ ... }).replace({ ... }) - एकल प्रतिस्थापन
  • db.collection.find({ ... }).upsert({ ... }) - सिंगल अपर्चर
  • db.collection.find({ ... }).remove() - मल्टी निकालें

आप सीमा को लागू भी कर सकते हैं, छोड़ सकते हैं, अपडेट को छांट सकते हैं और पहले से ही उनका पीछा करके निकाल सकते हैं।

यदि आप रुचि रखते हैं, तो मैंगो-हैकर देखें


1
TypeError: db.getCollection (...)। Find (...)। Update कोई फंक्शन नहीं है:?
एंथनी

काम नहीं किया db.userActivity.find({ 'appId' : 1234, 'status' : 1}).update({ $set: { 'status': 1 } }); 2017-06-05T17:47:10.038+0530 E QUERY [thread1] TypeError: db.userActivity.find(...).update is not a function :
प्रकाश पांडे

4

MongoDB क्लाइंट में, टाइप करें:

db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})

संस्करण 3.2 में नया

पैरामीटर ::

{}:  select all records updated

कीवर्ड तर्क multiनहीं लिया गया


3

MongoDB को केवल एक मिलान दस्तावेज़ मिलेगा जो क्वेरी मानदंड से मेल खाता है जब आप एक अपडेट कमांड जारी कर रहे हैं, जो भी दस्तावेज़ मैच पहले अपडेट होने के लिए होता है, भले ही अधिक दस्तावेज़ हों जो मानदंडों से मेल खाते हैं उन्हें अनदेखा कर दिया जाएगा।

इसलिए इसे दूर करने के लिए हम आपके अपडेट स्टेटमेंट में "MULTI" विकल्प को निर्दिष्ट कर सकते हैं, जिसका अर्थ उन सभी डॉक्यूमेंट्स को अपडेट करना है जो क्वेरी मापदंड से मेल खाते हैं। सभी डॉक्यूमेंट्स को संग्रह में स्कैन करें, जो मानदंड और अद्यतन से मेल खाते हों:

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )

2

निम्नलिखित कमांड एक संग्रह के कई रिकॉर्ड को अपडेट कर सकता है

db.collection.update({}, 
{$set:{"field" : "value"}}, 
{ multi: true, upsert: false}
)

1

मेरे पास एक ही समस्या थी, और मुझे इसका समाधान मिला, और यह एक आकर्षण की तरह काम करता है

बस ध्वज को इस तरह सच करने के लिए सेट करें:

 db.Collection.update(
                {_id_receiver: id_receiver},
               {$set: {is_showed: true}},
                {multi: true}   /* --> multiple update */
            , function (err, updated) {...});

मुझे आशा है कि वह मदद करेंगे :)


1

संपूर्ण संग्रह को अद्यतन करने के लिए,

db.getCollection('collection_name').update({},
{$set: {"field1" : "value1", "field2" : "value2", "field3" : "value3"}},
{multi: true })

0

आप उपयोग कर सकते हैं

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `

0

Mongodb updateMany () के सभी नवीनतम संस्करण ठीक काम कर रहे हैं

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});

-1

इसे साझा करने के लिए धन्यवाद, मैंने 2.6.7 का उपयोग किया और निम्नलिखित क्वेरी के लिए बस काम किया,

सभी डॉक्स के लिए:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})

एकल डॉक्टर के लिए:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.