如何在MongoShell中将MongoDB ISODate数组元素转换为格式化的字符串元素?

如何在MongoShell中将MongoDB ISODate数组元素转换为格式化的字符串元素?,mongodb,Mongodb,在我的MongoDB数据库中,由于错误引入了一些ISODates,我需要将它们更改为字符串格式 我试着用updateOne一个接一个地更新它们,选择数组中错误元素所在的元素,并用正确的字符串对其进行更改。这是可行的,但我需要对许多记录执行此操作,因此我需要将其自动化 我需要将类似于ISODate(“2013-02-25T16:01:50.742Z”)的当前元素(如db.myCollection.elements.myArray.0.date等集合中的元素)更改为字符串格式,如“2013-02-2

在我的MongoDB数据库中,由于错误引入了一些
ISODate
s,我需要将它们更改为字符串格式

我试着用
updateOne
一个接一个地更新它们,选择数组中错误元素所在的元素,并用正确的字符串对其进行更改。这是可行的,但我需要对许多记录执行此操作,因此我需要将其自动化

我需要将类似于
ISODate(“2013-02-25T16:01:50.742Z”)
的当前元素(如
db.myCollection.elements.myArray.0.date
等集合中的元素)更改为字符串格式,如
“2013-02-25 16:01:50”

另外,我需要找到数组中所有元素的日期,即ISO格式的日期,将其转换为字符串,然后更新它

myCollection中的文档格式如下:

{
   elements: 
   [
      { date: ISODate("2019-03-14T02:42:00Z")},
      { date: ISODate("2019-03-14T02:42:00Z")}
   ]
}
我需要当前的元素类似于 ISODate(“2013-02-25T16:01:50.742Z”),位于类似 db.myCollection.elements.myArray.0.date已更改为字符串格式 比如“2013-02-2516:01:50”

所以我需要找到,对于 数组,即ISO格式的日期,将其转换为字符串 一个,然后更新它

样本
dates3
集合:

{ "_id" : 1, "dt" : [ ISODate("2019-05-23T23:05:09Z"), ISODate("2019-11-02T16:01:48.066Z") ] }
{ "_id" : 2, "dt" : [ ISODate("2019-11-02T14:38:26Z"), "not date" ] }
{ "_id" : 9 }
{ "_id" : 10, "dt" : "not array" }
更新是从mongo shell运行的:

db.dates3.aggregate( [
{ $addFields: { dateArrayExists: { $isArray: "$dt" } } },
{ $match: { dateArrayExists: true } },
{ $project: { dt: { $map: { 
                         input: "$dt", 
                         as: "d", 
                         in: { $cond: { 
                                  if: { $eq: [ "date", { $type: "$$d" }  ] }, 
                                  then: { $dateToString: { format: "%Y-%m-%d %H:%M:%S", date: "$$d" } }, 
                                  else: "$$d" 
                                } 
                         } }
} } }
] ).forEach( doc => db.dates3.save(doc) );
dates3
集合已更新:

{ "_id" : 1, "dt" : [ "2019-05-23 23:05:09", "2019-11-02 16:01:48" ] }
{ "_id" : 2, "dt" : [ "2019-11-02 14:38:26", "not date" ] }
{ "_id" : 9 }
{ "_id" : 10, "dt" : "not array" }


[编辑添加]

更新要求:

我需要当前的元素类似于
ISODate(“2013-02-25T16:01:50.742Z”)
集合中的 与db.myCollection.elements.myArray.0.date类似,日期更改为字符串 格式类似于
“2013-02-25 16:01:50”

另外,我需要找到数组中所有元素的日期, 这是ISO格式,将其转换为字符串1,然后更新它

myCollection
中的文档格式如下:

{
   elements: 
   [
      { date: ISODate("2019-03-14T02:42:00Z")},
      { date: ISODate("2019-03-14T02:42:00Z")}
   ]
}
输入收集:

{ "_id" : 1, "dt" : [ { "date" : ISODate("2019-05-23T23:05:09Z") }, { "date" : ISODate("2019-11-02T16:01:48.066Z") } ] }
{ "_id" : 2, "dt" : [ { "date" : ISODate("2019-11-02T14:38:26Z") }, { "date" : "not date" } ] }
{ "_id" : 9 }
{ "_id" : 10, "dt" : "not array" }
{ "_id" : 1, "dt" : [ { "date" : "2019-05-23 23:05:09" }, { "date" : "2019-11-02 16:01:48" } ] }
{ "_id" : 2, "dt" : [ { "date" : "2019-11-02 14:38:26" }, { "date" : "not date" } ] }
{ "_id" : 9 }
{ "_id" : 10, "dt" : "not array" }
更新查询:

db.dates5.aggregate( [
  { $addFields: { dateArrayExists: { $isArray: "$dt" } } },
  { $match: { dateArrayExists: true } },
  { $unwind: "$dt" },
  { $project: { "dt.date": {  $cond: { 
                                      if: { $eq: [ "date", { $type: "$dt.date" }  ] }, 
                                      then: { $dateToString: { format: "%Y-%m-%d %H:%M:%S", date: "$dt.date" } }, 
                                      else: "$dt.date"
                                                  }  } } },
  { $group: { _id: "$_id", dt: { $push: { date: "$dt.date"} } } },
]).forEach( doc => db.dates5.save(doc) );
更新的收藏:

{ "_id" : 1, "dt" : [ { "date" : ISODate("2019-05-23T23:05:09Z") }, { "date" : ISODate("2019-11-02T16:01:48.066Z") } ] }
{ "_id" : 2, "dt" : [ { "date" : ISODate("2019-11-02T14:38:26Z") }, { "date" : "not date" } ] }
{ "_id" : 9 }
{ "_id" : 10, "dt" : "not array" }
{ "_id" : 1, "dt" : [ { "date" : "2019-05-23 23:05:09" }, { "date" : "2019-11-02 16:01:48" } ] }
{ "_id" : 2, "dt" : [ { "date" : "2019-11-02 14:38:26" }, { "date" : "not date" } ] }
{ "_id" : 9 }
{ "_id" : 10, "dt" : "not array" }

字符串“20130225160150”中的数字是多少?它代表什么(用什么术语,例如秒、毫秒等)。请澄清。要应用什么逻辑进行转换?请查看这些逻辑是否有帮助:。字符串应该只是时间戳的字符串格式。例如,与yyyymmddHHMMHH类似,字符串格式中缺少一些字符。连字符(“-”)不存在,最后几个字符也不存在。那么,你想在字符串中添加什么?“yyyymmddHHMMSS”?请具体一点,刚刚编辑过。我想用连字符对我来说没问题。我不需要最后的字符,直到第二次显示时,如果ISODate在一个字段中,这个字符会改变,所以第一个字符可能是:{“_id”:1,“dt”:[{start:ISODate(“2019-05-23T23:05:09Z”)},{end:ISODate(“2019-11-02T16:01:48.066Z”)}事实上就是这样,请用一个合适的例子来更新这篇文章,说明你在寻找什么。我刚刚添加了一个例子,说明我正在使用的收藏文件的相关部分的格式