mongodb使用forEach更新所有文档的密钥

Yaf*_*sky 3 foreach loops mongodb

我想在Mongo“订单”字段中更新所有文档,因此它们将是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++;
})
Run Code Online (Sandbox Code Playgroud)

4J4*_*J41 5

multi : true表示所有与查询匹配的文档都会被更新。您的查询是{},它匹配所有文档。因此,基本上,您order在每次迭代中都更新所有文档。

另外,snapshot必须在光标上启用模式,以确保不会多次返回同一文档。

您可以尝试以下方法:

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

从性能的角度来看,最好使用批量API。大量写入