Mongodb查询将日期数据类型从字符串更改为ISO日期类型。使用更新很多

问题描述 投票:0回答:1

我想使用 updateMany 操作将 MongoDB 集合中存储为字符串的日期转换为 ISODate 格式。

我迄今为止尝试过的方法遇到了错误。 第一种方法

db.collection.updateMany( { QCDate: { $exists: true } }, [ { $set: { QCDate: { $toDate: { $dateFromString: { dateString: "$QCDate" } } } } } ] ) 

错误:- 节点:572942)UnhandledPromiseRejectionWarning:MongoError:“u”类型错误。期望一个对象,得到一个数组。

第二种方法

db.collection.updateMany( { QCDate: { $exists: true } },{ $set: { QCDate: { $toDate: { $dateFromString: { dateString: "$QCDate"  } } } } } ) 

错误:-(节点:570001)UnhandledPromiseRejectionWarning:MongoError:'QCDate.$toDate'中的美元($)前缀字段'$toDate'对于存储无效。

mongodb
1个回答
0
投票

$dateFromString 和 $toDate 都将在第一次错误时停止操作,即无法将给定字符串转换为日期对象。这就是本例中发生的情况。请您先评估一下资料,并致电询问如何处理错误的文件。以下示例文档和操作日志可能会提供更多详细信息。

样本文件

xyz> use test
test> t = db.test;
test> t.drop()
test> t.find();
[
  {
    stringdate: '06-15-2008'
  },
  {
    stringdate: 'oct 20 2020'
  },
  {
    stringdate: '2017-02-08'
  },
  {
    stringdate: '2017-02-08T12:10:40.787'
  },
  {
    stringdate: '2017-02-08T12:10:40.787'
  }
]

行动日志

首先检查文件是否有错误。请注意,以下查询不会因错误而停止。这是通过OnError 实现的。这意味着在转换给定文档失败时,将提供 OnError 上给出的值。这对于识别错误文档很有用。在示例案例中,有一份这样的文档。此查询仅过滤此类文档并使用 _id 和旧日期值显示它。

test> t.aggregate([{ $project: { newdate: { $dateFromString: { dateString: '$stringdate', onError:'error' } },stringdate:1}},{$match:{newdate:'error'}}]);
[
  {
    _id: ObjectId('6641ad7451d50517dda0deea'),
    stringdate: '06-15-2008',
    newdate: 'error'
  }
]

以上查询结果将有助于评估文档。并打电话询问如何处理。在示例案例中,只有一份不可转换的文档。这应通过以下查询来纠正。

t.update({stringdate:'06-15-2008'}, { $set:{stringdate:'2008-06-15'}});

现在,当我们在步骤 1 中运行查询时,它不会产生任何文档。作为可选检查,还可以运行以下查询。它将计算该键中的类型数量并显示每种类型的计数。理想情况下,它应该只生成日期类型,并且计数应该根据集合中的文档进行。这可以确保转换过程完成并且键只有日期类型值。

t.aggregate([{$group:{_id:{$type:"$stringdate"},count:{$sum:1}}}]);
[ { _id: 'date', count: 5 } ]

请求您可以根据上述查询的输出来评估您的收藏。并查看有多少文档无法转换。通过查看音量,您将能够接听电话是否可以进行手动修正。更正此类文档后,您的第一个查询本身就足以完成工作。请注意其中的以下修改,$toDate 和 $dateFromString 本质上是相同的,因此只需一个就足够了。

db.collection.updateMany( { QCDate: { $exists: true } }, [ { $set: { QCDate: { $dateFromString: { dateString: "$QCDate" } }  } } ] )

注意:如果发现需要纠正的记录较多,则可能需要对错误文档进行进一步分析,以实现可能的自动化。然而,所需过程的基本性质保持不变 - 数据校正。

© www.soinside.com 2019 - 2024. All rights reserved.