使用forEach将一个键更新到所有文档中的mongodb

10 浏览
0 Comments

使用forEach将一个键更新到所有文档中的mongodb

我想在Mongo中更新所有文档的'order'字段,使它们变为1..2..3..4....34。

运行后,它们全部变为"order": "34"。

我做错了什么?

var i = 1;

db.images.find().forEach(function() {

db.images.update(

{},

{ "$set": {"order": NumberInt(i)} },

{ multi: true }

);

i++;

})

0
0 Comments

问题的原因是:multi:true表示将更新所有与查询匹配的文档。而你的查询是{},它匹配所有的文档。所以,基本上你在每次迭代中都在更新所有文档的order字段。另外,必须在游标上启用snapshot模式,以确保同一文档不会被返回多次。

解决方法是:可以尝试使用bulk APIs来提高性能。具体代码如下:

var i = 1;
db.images.find().snapshot().forEach(function(image) {
    db.images.update(
        {"_id" : image._id},
        { "$set": {"order": NumberInt(i)} }
    );
    i++;
})

感谢4J41的回答,这个方法有效。直到现在,我也不太确定{"_id" : image._id}是如何起作用的。谢谢。

Styvane,你能解释一下你所提到的内容吗?

0