我有这样的文件:
{
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
如何使用动态值对数组嵌套值的每个成员执行更新?
答案 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
来就地更新集合。