MongoDB: Bagaimana cara memperbarui banyak dokumen dengan satu perintah?

144

Saya terkejut menemukan bahwa kode contoh berikut ini hanya memperbarui satu dokumen:

> 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

Saya tahu saya bisa mengulang dan terus memperbarui sampai semuanya berubah, tetapi itu tampaknya sangat tidak efisien. Apakah ada cara yang lebih baik?

Luke Dennis
sumber

Jawaban:

247

Pembaruan multi ditambahkan baru-baru ini, sehingga hanya tersedia dalam rilis pengembangan (1.1.3). Dari shell Anda melakukan pembaruan multi dengan melewati truesebagai argumen keempat update(), di mana argumen ketiga adalah argumen upsert:

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

Untuk versi mongodb 2.2+, Anda perlu mengatur opsi multi true untuk memperbarui beberapa dokumen sekaligus.

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

Untuk versi mongodb 3.2+ Anda juga dapat menggunakan metode baru updateMany()untuk memperbarui banyak dokumen sekaligus, tanpa perlu multiopsi terpisah .

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
mdirolf
sumber
3
Saya tidak yakin tentang kapan perubahan ini terjadi tetapi, Mongodb v2.2.2 melakukan ini sedikit berbeda. db.collection.update (<query>, <update>, <options>) di mana opsi adalah seperangkat pasangan nilai kunci. Lihat dokumentasi: docs.mongodb.org/manual/applications/update
TechplexEngineer
3
bagaimana jika saya ingin mengatur nilai yang berbeda untuk dokumen yang berbeda? Adakah cara yang penting untuk melakukan ini?
zach
Cara melakukannya untuk nilai lama + "beberapa string"
Mahesh K
34

Mulai di v3.3 Anda dapat menggunakan pembaruanBanyak

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

Di v2.2, fungsi pembaruan mengambil bentuk berikut:

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

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

pengguna602525
sumber
16

Untuk versi Mongo> 2.2 , tambahkan bidang multi dan setel ke true

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

Saya telah menciptakan cara untuk melakukan ini dengan antarmuka yang lebih baik.

  • db.collection.find({ ... }).update({ ... }) - pembaruan multi
  • db.collection.find({ ... }).replace({ ... }) - penggantian tunggal
  • db.collection.find({ ... }).upsert({ ... }) - Upert tunggal
  • db.collection.find({ ... }).remove() - hapus multi

Anda juga dapat menerapkan batas, lewati, mengurutkan untuk pembaruan dan menghapus dengan merantai sebelumnya.

Jika Anda tertarik, periksa Mongo-Hacker

Tyler Brock
sumber
1
TypeError: db.getCollection (...). Find (...). Pembaruan bukan fungsi:?
Anthony
tidak bekerja 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

Di Klien MongoDB, ketik:

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

Baru dalam versi 3.2

Params ::

{}:  select all records updated

Argumen kata kunci multitidak diambil

Boseam
sumber
3

MongoDB akan menemukan hanya satu dokumen yang cocok yang cocok dengan kriteria kueri saat Anda mengeluarkan perintah pembaruan, dokumen mana pun yang pertama kali cocok akan diperbarui, bahkan jika ada lebih banyak dokumen yang cocok dengan kriteria akan diabaikan.

jadi untuk mengatasinya, kita dapat menentukan opsi "MULTI" dalam pernyataan pembaruan Anda, yang berarti memperbarui semua dokumen yang cocok dengan kriteria kueri. pindai semua dokumen dalam koleksi, temukan yang cocok dengan kriteria dan perbarui:

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

Perintah berikut dapat memperbarui beberapa catatan koleksi

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

Saya memiliki masalah yang sama, dan saya menemukan solusinya, dan itu bekerja seperti pesona

cukup atur multi-flag menjadi true seperti ini:

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

saya harap itu membantu :)

Amine_Dev
sumber
1

Untuk Memperbarui Seluruh Koleksi,

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

Anda bisa menggunakannya.`

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "[email protected]",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `
Jitendra
sumber
0

Semua versi terbaru dari mongodb updateMany () berfungsi dengan baik

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
KARTHIKEYAN.A
sumber
-1

Terima kasih telah berbagi ini, saya menggunakan 2.6.7 dan mengikuti kueri yang hanya berfungsi,

untuk semua dokumen:

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

untuk dokumen tunggal:

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