如何将数组中的日期字符串更新为 mongoDB 中的日期格式?

How to update date string in array to date format in mongoDB?

我的 mongoDB collection 看起来像这样:

[
  {
    "id": "myid",
    "field": {
      "total": 1,
      "subfield": [
        {
          "time": "2020-08-06T08:33:57.977+0530"
    
        },
        {
          "time": "2020-05-08T04:13:27.977+0530"
          
        }
      ]
    }
  },
  {
    "id": "myid2",
    "field": {
      "total": 1,
      "subfield": [
        {
          "time": "2020-07-31T10:15:50.184+0530"
        }
      ]
    }
  }
]

我需要更新所有文档并将 subfield 数组中可用字段 time 中的日期字符串转换为 mongoDB ISO 日期格式。

我在 subfield 数组

中有数千个文档和数百个 objects

我知道聚合函数 $todate$convert。 但我不想使用聚合,因为,

  1. 要使用 $todate$convert,我需要展开 field.subfield 数组,这又是一项昂贵的操作。

  2. 我想更新我的文档并用日期格式保存它。

My MongoDB server version: 4.0.3

我尝试了以下方法,但它似乎不起作用,也没有 return 任何错误。

db.collection.find().forEach(function(doc) { 
doc.field.subfield.time=new ISODate(doc.field.subfield.time);
db.collection.save(doc); 
})

您错过了 subfield 的循环,因为它是一个数组,

db.collection.find().forEach(function(doc) { 
    doc.field.subfield.forEach(function(r) {
        r.time = new ISODate(r.time);
    })
    db.collection.save(doc); 
})

如果这是一次那么时间并不重要,我认为如果你使用聚合或 forEach,两者将花费相同的时间。


如果您打算更新 MongoDb 版本,则从 4.2 开始, 您可以使用 update with aggregation pipeline

使用 updateMany() 更新的选项
db.collection.updateMany({},
    [{
        $set: {
            "field.subfield": {
                $map: {
                    input: "$field.subfield",
                    as: "r",
                    in: {
                        $mergeObjects: [
                            "$$r",
                            { time: { $toDate: "$$r.time" } }
                        ]
                    }
                }
            }
        }
    }]
)