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

如何实现类似于db.collection.find().limit(10)但更新文档?

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

一般来说,我想要返回给定数量的logging,并在每个logging中改变一个字段。

谢谢。

不幸的是,你拥有的解决方法是做到这一点唯一的方法AFAIK。 有一个布尔标志multi将更新所有的匹配(如果为true )或更新第一个匹配(当为false )。

您可以使用:

 db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach( function (e) { e.fieldToChange = "blah"; .... db.collection.save(e); } ); 

(对于每个代码的信誉: MongoDB:使用来自同一文档的数据更新文档 )

这将做什么只是改变你指定的条目数。 所以,如果你想添加一个名为“newField”的值为1的字段,只在“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} ); 

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

检索它们,然后使用$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中轻松地重写。

如答案所述,仍然无法将要更新(或删除)的文档数量限制为大于1的值。解决方法是使用以下内容:

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

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

 ids = db.collection.find(<condition>).limit(<limit>).map( function(doc) { return doc._id; } ); db.collection.updateMany({_id: {$in: ids}}, <update>}) 

不知道对更新应用限制的目的是什么(在SQL中甚至不可能)。 作为龙虾worte:更新只适用于一个文件或符合更新标准的所有文件。 因此,您必须根据您的需求调整标准,或根据以前的查询逐一更新。