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

时间:2009-11-16 04:18:47

标签: mongodb document nosql

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

> 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

我知道我可以循环并不断更新,直到它们全部改变,但这看起来非常低效。还有更好的方法吗?

12 个答案:

答案 0 :(得分:187)

最近添加了多次更新,因此仅在开发版本(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!"}})

答案 1 :(得分:31)

自V2.2起更新,更新功能采用以下形式:

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

所选答案不再适用。

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

答案 2 :(得分:12)

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

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

答案 3 :(得分:7)

我已经通过更好的界面创建了一种方法。

  • db.collection.find({ ... }).update({ ... }) - 多次更新
  • db.collection.find({ ... }).replace({ ... }) - 单一替换
  • db.collection.find({ ... }).upsert({ ... }) - 单个upsert
  • db.collection.find({ ... }).remove() - 多重删除

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

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

答案 4 :(得分:4)

在MongoDB客户端中,键入:

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

3.2版中的新功能

PARAMS ::

{}:  select all records updated

未采用关键字参数multi

答案 5 :(得分:3)

MongoDB只会在您发出更新命令时找到一个匹配查询条件的匹配文档,无论哪个文档首先匹配都会更新,即使有更多符合条件的文档也会被忽略。

所以为了克服这个问题,我们可以在更新语句中指定“MULTI”选项,这意味着更新所有符合查询条件的documnet。扫描集合中的所有documnets,找到符合条件并更新的那些:

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

我有同样的问题,我找到了解决方案,它就像一个魅力

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

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

我希望有帮助:)

答案 8 :(得分:1)

要更新整个集合,

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

答案 9 :(得分:0)

你可以使用。

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

答案 10 :(得分:0)

所有最新版本的mongodb updateMany()工作正常

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

答案 11 :(得分:-1)

感谢您分享此内容,我使用了2.6.7以及以下查询刚刚工作,

适用于所有文档:

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

单个doc:

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