如何限制mongodb中的更新文件数量

时间:2011-07-06 02:17:25

标签: mongodb

如何在更新文档时实现类似于db.collection.find().limit(10)的某些内容?

现在我正在使用一些非常糟糕的东西,例如使用db.collection.find().limit()获取文档然后更新它们。

一般来说,我想返回给定数量的记录并在每个记录中更改一个字段。

感谢。

7 个答案:

答案 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:更新仅适用于一个文档或符合更新条件的所有文档。因此,您必须根据需要调整标准,或者根据以前的查询逐个更新。