MongoDB: Birden fazla belgeyi tek bir komutla nasıl güncelleyebilirim?


145

Aşağıdaki örnek kodun yalnızca tek bir belgeyi güncelleştirdiğini görünce şaşırdım:

> 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

Hepsi değişene kadar döngü yapıp güncellemeye devam edebileceğimi biliyorum, ama bu çok verimsiz görünüyor. Daha iyi bir yol var mı?

Yanıtlar:


247

Son zamanlarda çoklu güncelleme eklendi, bu nedenle yalnızca geliştirme sürümlerinde (1.1.3) kullanılabilir. Kabuktan truedördüncü argüman olarak geçerek çoklu bir güncelleme yaparsınız update(), üçüncü argüman ise üst argümandır:

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

Mongodb 2.2+ sürümleri için, aynı anda birden fazla belgeyi güncellemek için multi true seçeneğini ayarlamanız gerekir.

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

Mongodb 3.2+ sürümleri updateMany()için, ayrı bir multiseçeneğe gerek olmadan birden fazla belgeyi bir kerede güncellemek için yeni bir yöntem de kullanabilirsiniz .

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

3
Bu değişikliğin ne zaman gerçekleştiğinden emin değilim, ancak Mongodb v2.2.2 bunu biraz farklı yapıyor. db.collection.update (<query>, <update>, <options>) burada seçenekler bir dizi anahtar değer çifti kümesidir. Belgelere bakın: docs.mongodb.org/manual/applications/update
TechplexEngineer

3
farklı bir belgeye farklı değerler ayarlamak istersem ne olur? bunu yapmanın müthiş bir yolu var mı?
zach

Eski değer + "bazı dize" için nasıl yapılır
Mahesh K

34

V3.3'ten başlayarak updateMany'yi kullanabilirsiniz

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

V2.2'de, güncelleme işlevi aşağıdaki formu alır:

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

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


16

İçin Mongo sürümü> 2.2 , bir saha multi eklemek ve gerçek olarak ayarlayın

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

7

Bunu daha iyi bir arayüzle yapmanın bir yolunu yarattım.

  • db.collection.find({ ... }).update({ ... }) - çoklu güncelleme
  • db.collection.find({ ... }).replace({ ... }) - tek değiştirme
  • db.collection.find({ ... }).upsert({ ... }) - tek çıkış
  • db.collection.find({ ... }).remove() - çoklu kaldırma

Ayrıca güncellemeleri önceden zincirleme yaparak sınırlayabilir, atlayabilir, sıralayabilir ve kaldırabilirsiniz.

Eğer ilgileniyorsanız, Mongo-Hacker göz atın


1
TypeError: db.getCollection (...). Find (...). Güncelleme bir işlev değil:?
Anthony

işe yaramadı 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 :
Prakash Pandey

4

MongoDB İstemcisi'ne şunu yazın:

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

3.2 sürümündeki yenilikler

parametreler ::

{}:  select all records updated

Anahtar kelime argümanı multialınmadı


3

MongoDB, bir güncelleme komutu verirken sorgu ölçütleriyle eşleşen yalnızca bir eşleşen belge bulur; ölçütlerle eşleşen daha fazla belge olsa bile, hangi belge eşleşmelerinin ilk güncellenmesi gerçekleşir.

bu nedenle bunun üstesinden gelmek için güncelleme ifadenizde "MULTI" seçeneğini belirleyebiliriz, yani sorgu ölçütleriyle eşleşen tüm dokümanları güncelleyin. kriterlere uyanları bulmak için koleksiyondaki tüm dokümanları tarayın ve güncelleyin:

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

2

Aşağıdaki komut bir koleksiyonun birden çok kaydını güncelleyebilir

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

1

Aynı sorunu yaşadım ve çözümü buldum ve bir cazibe gibi çalışıyor

sadece multi bayrağını şu şekilde true değerine ayarlayın:

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

umarım bu yardımcı olur :)


1

Tüm Koleksiyonu Güncellemek için,

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

0

Kullanabilirsiniz.

        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 () ' nin tüm son sürümleri gayet iyi çalışıyor

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

-1

Bunu paylaştığınız için teşekkürler, 2.6.7 ile kullandım ve aşağıdaki sorguyu çalıştım,

tüm dokümanlar için:

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

tek bir doküman için:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.