我惊讶地发现以下示例代码仅更新单个文档:
> 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起更新,更新函数采用以下形式:
db.collection.updateMany(, , { upsert: , writeConcern: , collation: , arrayFilters: [ , ... ] } )
所选答案不再适用.
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 })
我用更好的界面创建了一种方法.
db.collection.find({ ... }).update({ ... })
- 多次更新
db.collection.find({ ... }).replace({ ... })
- 单次更换
db.collection.find({ ... }).upsert({ ... })
- 单个插入
db.collection.find({ ... }).remove()
- 多删除
您还可以对更新应用限制,跳过,排序,并通过预先链接将其删除.
如果您有兴趣,请查看Mongo-Hacker