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?

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!"}})

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


16

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

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

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


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


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} )

2

Perintah berikut dapat memperbarui beberapa catatan koleksi

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

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 :)


1

Untuk Memperbarui Seluruh Koleksi,

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

0

Anda bisa menggunakannya.`

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

0

Semua versi terbaru dari mongodb updateMany () berfungsi dengan baik

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

-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})
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.