更新MongoDB中的子文档

时间:2013-05-23 16:03:18

标签: mongodb

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

我不确定您对字段值的操作方式new Date(visits.$.date)是否有效。此外,使用visits.$.date2008-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});
      }
    }
}