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

我知道我可以循环访问并不断更新,直到它们全部改变,但这似乎效率非常低。还有更好的办法吗?

346376 次浏览

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

我已经创建了一个更好的界面来实现这一点。

  • db.collection.find({ ... }).update({ ... })多重更新
  • db.collection.find({ ... }).replace({ ... })单次置换
  • db.collection.find({ ... }).upsert({ ... })单次上篮
  • db.collection.find({ ... }).remove()多次移除

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

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

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

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

在 v2.2中,update 函数的形式如下:

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

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

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

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

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

所有文件:

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

单身文件:

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

我也遇到过同样的问题,我找到了解决办法,而且非常有效

就像这样设置旗帜 multi 为 true:

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

我希望这能有所帮助:)

MongoDB 在发出 update 命令时只会找到一个匹配查询条件的匹配文档,即使有更多匹配条件的文档也会被忽略,只要首先匹配的文档就会被更新。

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

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

你可以用

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

在 MongoDB 客户端中,键入:

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

3.2版本新增

帕拉姆斯:

{}:  select all records updated

没有采用关键字参数 multi

所有最新版本的 mongodb updateMany ()都运行良好

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

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

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

要更新整个集合,

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

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的文件,并设置了审查标志:

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