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

Posted

技术标签:

【中文标题】MongoDB:如何使用单个命令更新多个文档?【英文标题】:MongoDB: How to update multiple documents with a single command? 【发布时间】:2010-12-16 22:28:45 【问题描述】:

我惊讶地发现下面的示例代码只更新了一个文档:

> 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

我知道我可以循环并不断更新,直到它们全部更改为止,但这似乎非常低效。有没有更好的办法?

【问题讨论】:

【参考方案1】:

updateMany() 方法的形式如下:

db.collection.updateMany(
   <filter>,
   <update>,
   
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   
)

餐厅集合包含以下文档:

 "_id" : 1, "name" : "Central Perk Cafe", "violations" : 3 
 "_id" : 2, "name" : "Rock A Feller Bar and Grill", "violations" : 2 
 "_id" : 3, "name" : "Empire State Sub", "violations" : 5 
 "_id" : 4, "name" : "Pizza Rat's Pizzaria", "violations" : 8 

以下操作会更新所有违规大于 4 的文档并 $set a flag for review:

try 
   db.restaurant.updateMany(
       violations:  $gt: 4  ,
       $set:  "Review" : true  
   );
 catch (e) 
   print(e);

【讨论】:

【参考方案2】:

要更新整个集合,

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

从 v3.3 开始您可以使用 updateMany

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

在 v2.2 中,更新函数采用以下形式:

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

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

【讨论】:

【参考方案5】:

感谢分享这个,我用 2.6.7 和下面的查询刚刚工作,

对于所有文档:

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

对于单个文档:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

我不确定这个变化是什么时候发生的,但是 Mongodb v2.2.2 做的有点不同。 db.collection.update( , , ) 其中 options 是一组键值对。请参阅文档:docs.mongodb.org/manual/applications/update 如果我想为不同的文档设置不同的值怎么办?有没有一种优雅的方式来做到这一点? oldvalue+"some string"怎么办【参考方案8】:

在 MongoDB 客户端中,键入:

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

3.2 版中的新功能

参数::

:  select all records updated

关键字参数multi 未采用

【讨论】:

【参考方案9】:

你可以使用。`

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

【讨论】:

【参考方案10】:

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

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

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

【讨论】:

【参考方案11】:

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

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

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

希望对你有帮助:)

【讨论】:

【参考方案12】:

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

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

【讨论】:

【参考方案13】:

我已经创建了一种使用更好的界面来执行此操作的方法。

db.collection.find( ... ).update( ... ) -- 多更新 db.collection.find( ... ).replace( ... ) -- 单个替换 db.collection.find( ... ).upsert( ... ) -- 单次插入 db.collection.find( ... ).remove() -- 多次删除

您还可以通过预先链接它们来对更新和删除应用限制、跳过、排序。

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

【讨论】:

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 : @Tyler 解释说,他提出的语法适用于他构建的 Mongo-Hacker - 不是开箱即用的。

以上是关于MongoDB:如何使用单个命令更新多个文档?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB——文档操作(更新文档)

如何使用 C# 驱动程序在 MongoDB 中更新和更新多个文档

MongoDB命令查找单个文档并在更新中有条件语句

MongoDB - 如何确保多次更新都成功?

如何使用 Java 中的 ObjectID 更新 MongoDB 中的文档

《MongoDB入门教程》第14篇 CRUD之更新文档