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

aws*_*sum 45 mongodb

如何db.collection.find().limit(10)在更新文档时实现类似的东西?

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

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

谢谢.

小智 37

您可以使用:

db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
    function (e) {
        e.fieldToChange = "blah";
        ....
        db.collection.save(e);
    }
);
Run Code Online (Sandbox Code Playgroud)

(forEach代码的信用:MongoDB:使用同一文档中的数据更新文档)

这样做只会改变您指定的条目数.因此,例如,如果要将值为1的"newField"字段添加到"collection"中的一半条目中,则可以放入

db.collection.find().limit(db.collection.count() / 2).forEach(
    function (e) {
        e.newField = 1;
        db.collection.save(e);
    }
);
Run Code Online (Sandbox Code Playgroud)

如果你想让另一半也有"newField"但值为2,你可以使用newField不存在的条件进行更新:

db.collection.update( { newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true} );
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,有多少查询将发送到 mongo 服务器?是 1 代表 find,N 代表 find 的 N 个结果吗? (2认同)
  • 真的 ?没人注意到这里的 N+1 数据库调用问题吗? (2认同)

lob*_*234 13

不幸的是,你有的解决方法是唯一的方法来做AFAIK.有一个布尔标志multi,可以更新所有匹配(何时true)或更新第一个匹配(何时false).


bay*_*lee 10

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

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


Pab*_*ero 8

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

检索它们然后同时使用更新$in更有效.

ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id)
People.in(_id: ids).update_all(lastname: 'Cantero')
Run Code Online (Sandbox Code Playgroud)

查询是使用Mongoid编写的,但也可以在Mongo Shell中轻松重写.