2

我有这样的文件:

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

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

我想做一些 psudo 之类的事情:

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

我已经阅读了有关 $ 和“点”符号的文档以及这里的几个类似问题,我尝试了以下代码:

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

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

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

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

4

1 回答 1

3

没有直接的方法可以做到这一点,因为 MongoDB 不支持引用文档的更新表达式。此外,该$运算符仅适用于第一个匹配项,因此只要仍有字段 where AnArray.Timeis of $typestring,您就必须执行此操作。

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

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

于 2013-06-05T12:41:54.643 回答