繁体   English   中英

在现有集合(mongodb)的所有文档中添加字段?

[英]Add a field in all documents in an existing collection (mongodb)?

我想在myCollection中的所有文档中添加一个带有序列整数的名为“ serie”的字段,例如:

{"_id" : "507f191e810c19239de098db", "name" : "John", "serie" : "1"}
{"_id" : "507f191e810c19729de860ea", "name" : "Dave"}, "serie" : "2"}
{"_id" : "507f191e810c19729de564ou", "name" : "Kate"}, "serie" : "3"}
......

objectId(_id)对于显示或记住不是很性感,因此我想保留它并添加另一个包含简单,短而唯一的数字的字段“ serie”,以标识每个文档,例如序列号。 所以我尝试了以下脚本,但在所有文档中都得到了相同的“ serie”值:

for(var i=1; i < 543; i++){    
  db.myCollection.update({},
    { $set: {"serie": i}},
    { upsert:false, multi: true });
}

谢谢您的帮助。

您在这里所做的事情本质上是问题的multi: true陈述的multi: true部分。 本质上,您说的是用此数字更新“一切”,共543次。

要获得越来越多的数量,请执行以下操作:

var i = 1;
db.myCollection.find().forEach(function(doc) {
    db.myCollection.update(
        { "_id": doc._id },
        { "$set": { "serie": i } }
    );
    i++;
)

还是使用MongoDB 2.6及更高版本的批处理速度更快

var i = 1;

var cmd = { 
    "update": "myCollection",
    "updates": []
};

db.myCollection.find().forEach(function(doc) {

    cmd.updates.push({
        "q": { "_id": doc._id },
        "u": { "$set": { "serie": i } }
    });

    if ( batch.length % 500 == 0 ) {
        db.runCommand(cmd);
        cmd.updates = [];
    }
    i++;

});

if ( cmd.updates.length > 0 )
    db.runCommand(cmd);

因此,这不仅因为没有在每个更新上都提取写确认而更快,而且还因为它一次发送的批处理大小为500,因此速度更快。

谢谢,我明白了,我只是将NumberInt(i)添加到您的答案中,以获得{“ serie”:“ 1”}而不是{“ serie”:“ 1.00000”}

var i = 1
db.myCollection.find().forEach(function(doc) {
    db.myCollection.update(
        { "_id": doc._id },
        { "$set": { "serie": NumberInt(i)} }
    );
    i++;
    })

谢谢尼尔的帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM