如何db.collection.find().limit(10)
在更新文档时实现类似的东西?
现在我正在使用一些非常糟糕的东西,例如获取文档db.collection.find().limit()
然后更新它们.
一般来说,我想返回给定数量的记录并在每个记录中更改一个字段.
谢谢.
小智 37
您可以使用:
db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
function (e) {
e.fieldToChange = "blah";
....
db.collection.save(e);
}
);
Run Code Online (Sandbox Code Playgroud)
(forEach代码的信用:MongoDB:使用同一文档中的数据更新文档)
这样做只会改变您指定的条目数.因此,例如,如果要将值为1的"newField"字段添加到"collection"中的一半条目中,则可以放入
db.collection.find().limit(db.collection.count() / 2).forEach(
function (e) {
e.newField = 1;
db.collection.save(e);
}
);
Run Code Online (Sandbox Code Playgroud)
如果你想让另一半也有"newField"但值为2,你可以使用newField不存在的条件进行更新:
db.collection.update( { newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true} );
Run Code Online (Sandbox Code Playgroud)
bay*_*lee 10
使用forEach
单独更新每个文件是缓慢的.您可以使用批量更新文档
ids = db.collection.find(<condition>).limit(<limit>).map(
function(doc) {
return doc._id;
}
);
db.collection.updateMany({_id: {$in: ids}}, <update>})
Run Code Online (Sandbox Code Playgroud)
迭代所有对象然后单独更新它们的解决方案非常慢.
检索它们然后同时使用更新$in
更有效.
ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id)
People.in(_id: ids).update_all(lastname: 'Cantero')
Run Code Online (Sandbox Code Playgroud)
查询是使用Mongoid编写的,但也可以在Mongo Shell中轻松重写.
归档时间: |
|
查看次数: |
23357 次 |
最近记录: |