在MongoDB中将字段添加到上限集合中

时间:2016-02-06 16:28:13

标签: mongodb capped-collections

我创建了一个上限集合来存储我的日志数据,只有很少的字段。由于某些要求,我想在此集合中添加名为“createAt”的附加字段。

db.myLogs.update({},{$set: {"createAt":new Date()}})

这是抛出以下错误:

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 10003,
                "errmsg" : "Cannot change the size of a document in a capped collection: 39 != 57"
        }
})

如何将一些字段添加到上限集合中?

1 个答案:

答案 0 :(得分:4)

简单回答

正如mongod告诉你的,你做不到。和the documentation一样:

  

如果更新操作导致文档增长超出文档的原始大小,则更新操作将失败。

稍微复杂的答案

如果该字段不是必填字段,只需使用该字段添加新文档,并保留旧文档,使用没有该字段的文档的合理默认值。

如果你真的需要这样做

  1. 停止阅读和写入有上限的集合
  2. 将文档从上限集合复制到临时集合
  3. 根据需要在临时集合中更改文档
  4. 删除并重新创建上限集合
  5. 按所需顺序从临时集合中读取文档,并将其插入重新创建的上限集合中。
  6. 在你做“1”之后,你可以使用这样的东西来表示“2”。在shell上:

    var bulk = db.temp.initializeOrderedBulkOp();
    var counter = 0;
    
    db.capped.find().forEach(
    
      function(doc){
        bulk.insert(doc);
    
        // In case you have a lot of documents in
        // your capped collection, it makes sense
        // to do an intermediate execute
        if( ++counter % 10000 == 0){
          bulk.execute();
          bulk = db.temp.initializeOrderedBulkOp();
        }
    
      }
    );
    // execute the remainder
    bulk.execute() 
    

    这应该很容易适应“5”。