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

问题描述

我的mongoDB集合看起来像这样:

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

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

我在subfield数组中有成千上万个文档和数百个对象

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

  1. 要使用$todate$convert,我需要展开{​​{1}}数组,这又是一个昂贵的操作。

  2. 我想更新我的文档并将其保存为日期格式。

我的MongoDB服务器版本:4.0.3

我尝试了以下操作,但它似乎不起作用,也没有返回任何错误

field.subfield 

解决方法

您错过了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" } }
                        ]
                    }
                }
            }
        }
    }]
)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...