如何限制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:更新只适用于一个文件或符合更新标准的所有文件。 因此,您必须根据您的需求调整标准,或根据以前的查询逐一更新。