如何在更新文档时实现类似于db.collection.find().limit(10)
的某些内容?
现在我正在使用一些非常糟糕的东西,例如使用db.collection.find().limit()
获取文档然后更新它们。
一般来说,我想返回给定数量的记录并在每个记录中更改一个字段。
感谢。
答案 0 :(得分:33)
您可以使用:
db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
function (e) {
e.fieldToChange = "blah";
....
db.collection.save(e);
}
);
(forEach代码的鸣谢:MongoDB: Updating documents using data from the same document)
这样做只会更改您指定的条目数。因此,如果您想要将值为1的“newField”字段添加到“collection”中只有一半的条目,例如,您可以输入
db.collection.find().limit(db.collection.count() / 2).forEach(
function (e) {
e.newField = 1;
db.collection.save(e);
}
);
如果你想让另一半也有“newField”但值为2,你可以在newField不存在的条件下进行更新:
db.collection.update( { newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true} );
答案 1 :(得分:11)
不幸的是,您拥有的解决方法是AFAIK的唯一方法。有一个布尔标志multi
,可以更新所有匹配项(true
时)或更新第一个匹配项(false
时)。
答案 2 :(得分:9)
迭代所有对象然后单独更新它们的解决方案非常慢。
检索它们然后使用$in
同时更新效率更高。
ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id)
People.in(_id: ids).update_all(lastname: 'Cantero')
查询是使用Mongoid编写的,但也可以在Mongo Shell中轻松重写。
答案 3 :(得分:7)
使用forEach
单独更新每个文档的速度很慢。您可以使用
ids = db.collection.find(<condition>).limit(<limit>).map(
function(doc) {
return doc._id;
}
);
db.collection.updateMany({_id: {$in: ids}}, <update>})
答案 4 :(得分:1)
正如答案所述,仍无法将更新(或删除)文件的数量限制为值&gt; 1.使用类似以下内容的解决方法:
db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})})
答案 5 :(得分:0)
如果您的ID是序列号而不是ObjectId,则可以在for循环中执行此操作:
let batchSize= 10;
for (let i = 0; i <= 1000000; i += batchSize) {
db.collection.update({$and :[{"_id": {$lte: i+batchSize}}, {"_id": {$gt: i}}]}),{<your update>})
}
答案 6 :(得分:-8)
不确定应用更新限制的目的是什么(在SQL中甚至不可能)。 作为龙虾worte:更新仅适用于一个文档或符合更新条件的所有文档。因此,您必须根据需要调整标准,或者根据以前的查询逐个更新。