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

时间:2014-05-23 22:10:40

标签: javascript mongodb

我想在myCollection中添加一个名为" serie"的字段。使用序列整数,例如:

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

objectId(_id)在显示或通过humains记忆时并不性感,所以我想保留它并添加其他字段' serie'包含简单,简短和唯一的数字,以识别每个文档,如序列号。所以我尝试了以下脚本,但我得到了相同的#34; serie"所有文档中的值:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

您在此处所做的事情的问题基本上是您的陈述的multi: true部分。基本上你是说更新&#34;一切&#34;这个数字,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的更新。

答案 1 :(得分:2)

谢谢你,我明白了,我刚刚将你的答案添加到了我的答案{{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++;
    })

感谢Neil的帮助