MongoDB:如何用一个命令更新多个文档?


144

我很惊讶地发现以下示例代码仅更新一个文档:

> 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

我知道我可以循环浏览并不断更新,直到它们都被更改为止,但这似乎效率很低。有没有更好的办法?

Answers:


247

多更新是最近添加的,因此仅在开发版本(1.1.3)中可用。在shell中,您可以通过将true第四个参数作为传递给update(),从而进行多次更新,第三个参数是upsert参数:

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

对于mongodb 2.2或更高版本,您需要将选项multi true设置为一次更新多个文档。

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(<query>,<update>,<options>),其中options是一组键值对。请参阅文档:docs.mongodb.org/manual/applications/update
TechplexEngineer 2012年

3
如果我要为不同的文档设置不同的值怎么办?有合适的方法吗?
zach 2013年

如何针对oldvalue +“某些字符串”执行此操作
Mahesh K


16

对于Mongo版本> 2.2,添加一个multi字段并将其设置为true

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() -多删除

您还可以通过预先链接限制,跳过,对更新和删除进行排序,删除。

如果您有兴趣,请查看Mongo-Hacker


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”选项,这意味着更新所有与查询条件匹配的文件。扫描集合中的所有documnet,找到与条件匹配的documnet,并更新:

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

2

以下命令可以更新集合的多个记录

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

1

我遇到了同样的问题,我找到了解决方案,它的工作原理很像

只需将标志multi设置为true就像这样:

 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})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.