MongoDB: Làm thế nào để cập nhật nhiều tài liệu bằng một lệnh?


144

Tôi đã ngạc nhiên khi thấy rằng mã ví dụ sau chỉ cập nhật một tài liệu duy nhất:

> 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

Tôi biết tôi có thể lặp lại và tiếp tục cập nhật cho đến khi tất cả chúng thay đổi, nhưng điều đó dường như không hiệu quả. Có cách nào tốt hơn?

Câu trả lời:


247

Đa cập nhật đã được thêm vào gần đây, vì vậy chỉ có sẵn trong các bản phát hành phát triển (1.1.3). Từ shell bạn thực hiện một bản cập nhật đa bằng cách chuyển truelàm đối số thứ tư sang update(), trong đó đối số thứ ba là đối số upsert:

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

Đối với các phiên bản mongodb 2.2+, bạn cần đặt tùy chọn multi true để cập nhật nhiều tài liệu cùng một lúc.

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

Đối với các phiên bản của mongodb 3.2+, bạn cũng có thể sử dụng phương pháp mới updateMany()để cập nhật nhiều tài liệu cùng một lúc mà không cần multitùy chọn riêng .

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

3
Tôi không chắc chắn về sự thay đổi này xảy ra khi nào, nhưng Mongodb v2.2.2 thực hiện điều này hơi khác một chút. db.collection.update (<truy vấn>, <update>, <tùy chọn>) trong đó tùy chọn là một tập hợp các cặp giá trị khóa. Xem tài liệu: docs.mongodb.org/manual/appluggest/update
TechplexEngineer

3
Nếu tôi muốn đặt các giá trị khác nhau cho tài liệu khác nhau thì sao? Có một cách bất hợp pháp để làm điều này?
zach

Làm thế nào để làm điều đó cho oldvalue + "một số chuỗi"
Mahesh K


16

Đối với phiên bản Mongo> 2.2 , hãy thêm đa trường và đặt thành đúng

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

7

Tôi đã tạo ra một cách để làm điều này với một giao diện tốt hơn.

  • db.collection.find({ ... }).update({ ... }) - cập nhật đa
  • db.collection.find({ ... }).replace({ ... }) - thay thế đơn
  • db.collection.find({ ... }).upsert({ ... }) - nâng cấp đơn
  • db.collection.find({ ... }).remove() - đa loại bỏ

Bạn cũng có thể áp dụng giới hạn, bỏ qua, sắp xếp các bản cập nhật và xóa bằng cách xâu chuỗi chúng trước.

Nếu bạn quan tâm, hãy xem Mongo-Hacker


1
LoạiError: db.getCollection (...). Find (...). Cập nhật không phải là một hàm :?
Anthony

không hoạt động 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

Trong Máy khách MongoDB, gõ:

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

Phiên bản mới 3.2

Params ::

{}:  select all records updated

Đối số từ khóa multikhông được thực hiện


3

MongoDB sẽ chỉ tìm thấy một tài liệu phù hợp với tiêu chí truy vấn khi bạn đang ban hành lệnh cập nhật, bất kỳ tài liệu nào khớp với lần đầu tiên sẽ được cập nhật, ngay cả khi có nhiều tài liệu phù hợp với tiêu chí sẽ bị bỏ qua.

Vì vậy, để khắc phục điều này, chúng tôi có thể chỉ định tùy chọn "MULTI" trong câu lệnh cập nhật của bạn, nghĩa là cập nhật tất cả các tài liệu phù hợp với tiêu chí truy vấn. quét tất cả các tài liệu trong bộ sưu tập để tìm những tài liệu phù hợp với tiêu chí và cập nhật:

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

2

Lệnh sau có thể cập nhật nhiều bản ghi của một bộ sưu tập

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

1

Tôi đã có cùng một vấn đề, và tôi đã tìm ra giải pháp, và nó hoạt động như một cơ duyên

chỉ cần đặt cờ đa thành đúng như thế này:

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

tôi hy vọng điều đó sẽ giúp :)


1

Để cập nhật toàn bộ bộ sưu tập,

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

0

Bạn có thể sử dụng.

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

0

Tất cả các phiên bản mới nhất của mongodb updateMany () đang hoạt động tốt

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

-1

Cảm ơn đã chia sẻ điều này, tôi đã sử dụng với 2.6.7 và truy vấn sau chỉ hoạt động,

cho tất cả các tài liệu:

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

cho tài liệu duy nhất:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.