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(在 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:如何使用单个命令更新多个文档?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 驱动程序在 MongoDB 中更新和更新多个文档