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

如何限制mongodb中更新文档的数量,mongodb,Mongodb,如何在更新文档时实现类似于db.collection.find()limit(10)的功能 现在我正在使用一些非常糟糕的东西,比如用db.collection.find().limit()获取文档,然后更新它们 一般来说,我想返回给定数量的记录,并在每个记录中更改一个字段 谢谢。不幸的是,你的解决方案是唯一一个可以顺利完成的方法。有一个布尔标志multi,它将更新所有匹配项(当true时)或更新第一个匹配项(当false时)。不确定对更新应用限制的目的是什么(在SQL中甚至不可能)。 作为龙虾汁

如何在更新文档时实现类似于db.collection.find()limit(10)的功能

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

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


谢谢。

不幸的是,你的解决方案是唯一一个可以顺利完成的方法。有一个布尔标志
multi
,它将更新所有匹配项(当
true
时)或更新第一个匹配项(当
false
时)。

不确定对更新应用限制的目的是什么(在SQL中甚至不可能)。 作为龙虾汁:更新仅对一个文档或与更新条件匹配的所有文档起作用。因此,您必须根据自己的需要调整标准,或根据以前的查询逐一更新标准。

您可以使用:

db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
    function (e) {
        e.fieldToChange = "blah";
        ....
        db.collection.save(e);
    }
);
(forEach代码的学分:)

这只会更改您指定的条目数。因此,如果您想添加一个名为“newField”的字段,该字段的值为1,例如,您可以将

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的值。使用以下内容的变通方法:

db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})})
db.collection.find().limit()

迭代所有对象然后单独更新它们的解决方案非常慢

在中使用
$in同时检索它们更有效

ids=People.where(firstname:'Pablo')。limit(10000)。only(:_id)。to_a.map(&:id)
People.in(_id:ids).update_all(lastname:'Cantero')

查询是使用Mongoid编写的,但也可以在MongoShell中轻松重写。

使用
forEach
单独更新每个文档很慢。您可以使用批量更新文档

ids = db.collection.find(<condition>).limit(<limit>).map(
    function(doc) {
        return doc._id;
    }
);
db.collection.updateMany({_id: {$in: ids}}, <update>})
ids=db.collection.find().limit().map(
功能(doc){
退货单.\u id;
}
);
db.collection.updateName({u id:{$in:ids},})

如果您的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>})
}
让batchSize=10;

例如(让i=0;我在我的数据上测试了这两种方法,find()all,然后update()的工作速度比find_和_modify()快得多。看起来这是一种方法。事实并非如此,当然你可以在SQL中添加更新限制。例如:“update table SET x=1,其中x=0 limit 10”。仅供参考:这方面有一个问题(自2010年起,v1.6.0版)但是没有计划很快发布。此票证现在已修复,但实际上并不是关于添加更新操作的限制(仅涉及$hint)。如果使用此方法,您应该向查询添加投影以提高性能(您只需要_id):db.collection.find(,{u id:1}),当我尝试此方法时,它会说:[ASYNC-10007]无法将Mongosh API对象作为参数传递给函数在这种情况下,有多少查询将发送到mongo服务器?是1表示查找,N表示查找结果吗?真的吗?这里没有人注意到N+1 db调用问题?