0

我正在尝试将某些字段更新为 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)}})
}

但我无法改变visit.date。我尝试了以下但没有成功:

db.collection.update({"_id" : doc._id}, {$set: {"visits.$.date": new Date(visits.$.date)}})

这给了我JavaScript execution failed: ReferenceError: visits is not defined

提前致谢!

4

1 回答 1

0

我不确定您对字段值进行操作的方式是否new Date(visits.$.date)可行。此外,使用visits.$.dateas的值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});
      }
    }
}
于 2013-05-24T03:12:58.377 回答