【问题标题】:Add a field in all documents in an existing collection (mongodb)?在现有集合(mongodb)的所有文档中添加一个字段?
【发布时间】:2017-06-26 21:55:34
【问题描述】:

我想在 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 });
}

感谢您的帮助。

【问题讨论】:

  • 这个问题同样比你想象的要广泛得多,而且你的目的也很不清楚。你想以什么样的顺序添加这个递增的字段?你有没有想过你会如何在 SQL 数据库之类的东西中做这样的事情,你认为这里的过程会有什么不同?您是否知道您在此处显示的现有 _id 值既是唯一值的主键,又是单调的(不断增加)?
  • @NeilLunn,抱歉不清楚,我编辑了我的问题,谢谢

标签: javascript mongodb


【解决方案1】:

您在这里所做的问题本质上是您声明的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 个批量大小发送更新。

【讨论】:

    【解决方案2】:

    谢谢,我明白了,我刚刚在您的答案中添加了 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++;
        })
    

    感谢尼尔的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 2020-10-01
      • 2020-07-04
      • 1970-01-01
      • 2021-08-19
      • 2011-12-04
      • 2014-07-20
      相关资源
      最近更新 更多