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})