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

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

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

更新自V2.2起,更新函数采取以下forms:

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

所选答案不再适用。

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

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

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

我已经创build了一个更好的界面来做到这一点。

  • db.collection.find({ ... }).update({ ... }) – 多更新
  • db.collection.find({ ... }).replace({ ... }) – 单个replace
  • db.collection.find({ ... }).upsert({ ... }) – 单个upsert
  • db.collection.find({ ... }).remove() – 多删除

您也可以应用限制,跳过,对更新进行sorting,并通过预先链接进行删除。

如果你有兴趣,请检查Mongo-Hacker

当你发出一个更新命令时,MongoDB将只能find一个与查询条件相匹配的匹配文档,无论哪个文档匹配首先碰巧得到更新,即使有更多的匹配条件的文档会被忽略。

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

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

在MongoDB客户端中,input:

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

3.2版本的新function

PARAMS ::

 {}: select all records updated 

关键字参数multi没有采取

我有同样的问题,我find了解决scheme,它就像一个魅力

只需将标志设置为true即可:

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

我希望帮助:)

你可以使用

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

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

对于所有文档:

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

对于单个文档:

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