将新字段添加到具有现有字段值的集合中

时间:2012-02-10 08:29:46

标签: mongodb

我想在集合中添加一个新字段,新字段的值设置为现有字段的值。

具体来说,我想从此开始:

# db.foo.findOne()
    {
        "_id"     : ObjectId("4f25c828eb60261eab000000"),
        "created" : ISODate("2012-01-29T16:28:56.232Z"),
        "..."     : ...
    }

到此:

# db.foo.findOne()
    {
        "_id"      : ObjectId("4f25c828eb60261eab000000"),
        "created"  : ISODate("2012-01-29T16:28:56.232Z"),  
        "event_ts" : ISODate("2012-01-29T16:28:56.232Z"),  #same as created
        "..."      : ...
    }

(此集合中的新文档不会都具有这种特殊的冗余,但我想为现有文档执行此操作)

5 个答案:

答案 0 :(得分:44)

function addEventTsField(){
    db.foo.find().forEach(function(doc){
         db.foo.update({_id:doc._id}, {$set:{"event_ts":doc.created}});
    });
}

从控制台运行:

addEventTsField();

答案 1 :(得分:2)

不,这是不可能的。只有你可能知道的两个步骤:

  1. 加载文档,读取字段。 (如果性能有问题,您只能加载specific fields_idcreated
  2. 文档的原子更新(使用加载的event_ts字段设置created

答案 2 :(得分:1)

Mongo 4.2开始,db.collection.update()可以接受聚合管道,最终允许基于另一个字段创建一个字段:

// {
//   "created" : ISODate("2012-01-29T16:28:56.232Z"),
//   "..." : "..."
// }
db.collection.updateMany({}, [{ $set: { event_ts: "$created" } }])
// {
//   "created" :  ISODate("2012-01-29T16:28:56.232Z"),
//   "event_ts" : ISODate("2012-01-29T16:28:56.232Z"),
//   "..." : "..."
// }
  • 第一部分{}是匹配查询,用于过滤要更新的文档(此处保留所有文档)。

  • 第二部分[{ $set: { event_ts: "$created" } }]是更新聚合管道(请注意方括号表示使用聚合管道)。 $set是新的聚合运算符,并且是$addFields的别名,它允许在文档中包含新字段。

答案 3 :(得分:-1)

因为您的代码已经知道如何处理event_ts,为什么需要复制数据呢?您可以改为重命名该字段:

{ $rename : { old_field_name : new_field_name } }

请参阅http://www.mongodb.org/display/DOCS/Updating

答案 4 :(得分:-1)

如果这是一次性的事情,那没什么大不了的。运行类似" db.foo.find();"的查询在你的mongo shel中并将整个输出粘贴到Textpad或Sublime文本等编辑器中,做一个列块(在崇高文本中它是Ctrl +滚轮点击和拖动),粘贴它将扩展到另一个字段,重命名新粘贴的列,如果你想要它,一旦完成,做一个正则表达式只是编辑整个束作为" ^"使用" db.foo.insert({"并在" $" as"});"

它类似于以下步骤。

  
      
  1. 你粘贴了输出   {' field1' :value,' field2' :value2,' field3' :value4};   
        
    1. 复制最后一组并使用编辑器列块进行扩展   {' field1' :value,' field2' :value2,' field3' :value4};
    2.   
    3. 现在插入适当的单词,使其看起来像mongo的命令   db.foo.insert({' field1':value,' field2':value2,' field3':value4});
    4.   
    5. 现在将它们全部复制并粘贴到您的mongo shell中,它将根据您的需要为您完成整个过程。测试一次并在清理集合后重做整个事情,否则它将插入重复项。同时删除" _id"输出中的字段,因为当您再次尝试插入时它会发生冲突!
    6.   
  2.   

现在,编辑器中的每一行都会显示一个有效的mongo命令,该命令可以粘贴到shell中,以便将新文档插入到集合中。所以测试它一次,它工作正常,清理整个集合,如" db.foo.remove({});"并从编辑器粘贴整个命令,这将是一个非常好的。

第一次尝试时可能会很困难,但是如果你做得对,那么无论什么时候你想要它都可以帮助你工作....