我正在尝试将某些字段更新为Date对象,但是当字段位于子文档中时,我遇到了一些问题。可能是一个超级简单的问题,但我无法做对..
该集合具有以下结构:
{
"dob": "1989-03-12",
"gender": "M",
"visits": [
{
"date": "2002-03-01",
"type": "NO23",
},
{
"checked": "2012-03-02",
"type": "NO11",
}]
},
{
"dob": "1970-08-22",
"gender": "M",
"visits": [
{
"date": "2008-09-01",
"type": "NO23",
},
{
"checked": "2010-09-02",
"type": "NO11",
}]
}, ...
我已在Mongo控制台中使用以下内容更新了所有文档的 dob::
var cursor = db.collection.find();
while (cursor.hasNext()) {
var doc = cursor.next()
db.collection.update({_id : doc._id}, {$set : {dob : new Date(doc.dob)}})
}
但我无法改变 visits.date 。我尝试了以下但没有成功:
db.collection.update({"_id" : doc._id}, {$set: {"visits.$.date": new Date(visits.$.date)}})
给了我JavaScript execution failed: ReferenceError: visits is not defined
提前致谢!
答案 0 :(得分:0)
我不确定您对字段值的操作方式new Date(visits.$.date)
是否有效。此外,使用visits.$.date
等2008-09-01
的值可能无法与new Date()
一起正常使用。相反,您可能需要按https://stackoverflow.com/a/2587398/1847471中所述解析它。有点复杂,但这是我试过的:
function parseDate(input) {
var parts = input.match(/(\d+)/g);
return new Date(parts[0], parts[1]-1, parts[2]);
}
var cursor = db.collection.find();
while (cursor.hasNext()) {
var doc = cursor.next()
db.collection.update({_id : doc._id}, {$set : {collection : new Date(doc.collection)}})
for (var visit in doc.visits) {
var val = doc.visits[visit].date;
if (val != undefined) {
var set_hash = {};
set_hash["visits."+visit+".date"] = parseDate(val);
db.collection.update({"_id" : doc._id}, {$set: set_hash});
}
}
}