MongoDB - 动态更新嵌套数组中的对象

时间:2013-06-05 12:17:00

标签: json mongodb insert-update

我有这样的文件:

{
  Name : val
  AnArray : [
     { 
        Time : SomeTime
     },
     {
        Time : AnotherTime
     }
     ...arbitrary more elements
}

我需要将“时间”更新为日期类型(现在它是字符串)

我想做像psudo这样的事情:

foreach record in document.AnArray { record.Time = new Date(record.Time) }

我在这里阅读了关于$和“dot”符号的文档以及几个类似的问题,我试过这段代码:

db.collection.update({_id:doc._id},{$set : {AnArray.$.Time : new Date(AnArray.$.Time)}});

希望$会迭代“AnArray”属性的索引,因为我不知道每条记录的长度。但我得到错误:

SyntaxError: missing : after property id (shell):1

如何使用动态值对数组嵌套值的每个成员执行更新?

1 个答案:

答案 0 :(得分:3)

没有直接的方法可以做到这一点,因为MongoDB不支持引用该文档的update-expression。此外,$运算符仅适用于第一个匹配项,因此只要仍有AnArray.Time$type字符串的字段,您就必须执行此操作。

但是,您可以使用JavaScript以您喜欢的语言或mongo控制台执行更新客户端:

db.collection.find({}).forEach(function (doc) {
       for(var i in doc.AnArray)
       {
          doc.AnArray[i].Time = new Date(doc.AnArray[i].Time);
       }
       db.outcollection.save(doc); 
})

请注意,这会将迁移的数据存储在其他集合中。您还可以使用outcollection替换collection来就地更新集合。