【问题标题】:Convert string to datetime in mongodb在mongodb中将字符串转换为日期时间
【发布时间】:2021-08-04 03:01:16
【问题描述】:

我有一些字段假设为日期时间,但一些日期值作为字符串从应用程序中插入,因此现在这些字段变为混合数据类型。字符串格式如下: “2010 年 5 月 13 日星期二 00:00:00 CDT”。

我正在尝试将日期的所有字符串类型转换为日期时间,我使用以下格式,使用 CreateDate 作为有此问题的示例字段:

db.Test.aggregate([
    { "$addFields": {
        "$CreateDate": { 
            "$dateFromString": { 
                "dateString": "$CreateDate",
                timezone: "America/Chicago"
            } 
        }
    } }
])

但我收到以下错误:

errmsg" : "解析日期字符串'Tue May 13 00:00:00 CDT 2010'时出错"

我使用的是 Mongo 3.6 版本,格式似乎仅在 4.0 中是新的。任何帮助将不胜感激。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您应该从不将日期/时间值存储为字符串,使用正确的 Date 对象。您的问题是该声明有效性的又一个例子。

    Mongo 版本 4 也无济于事。不支持月份名称,请参阅Format Specifiers

    我认为您必须使用 3rd 方库,例如moment.js 但不能直接使用,即db.Test.aggregate([{$set: {CreateDate: moment("$CreateDate").toDate()}}])

    你可以用这样的循环纠正错误的值:

    db.Test.find({ CreateDate: { $not: { $type: "date" } } }).forEach(function(doc) {
        let d = moment(doc.CreateDate).toDate();
        db.Test.updateOne({ _id: doc._id }, { $set: { CreateDate: d } });    
    })
    

    【讨论】:

    • 是的。数据是由一些开发代码(不是我)从前端输入的,不幸的是我必须清理它们。 Mongodb 并没有真正从数据库端阻止列的数据类型,所以这就是问题所在。或者无论如何我可以查询那些坏数据?就像我想查询集合,结果只有 CreateDate 是字符串类型而不是日期时间类型。
    • 你能告诉我一些如何使用moment.js的例子吗?
    • 是的,您必须确保在您的应用程序或Schema Validation 中使用正确的数据类型。请查看我的更新。
    • 如何导入 moment.js 库?使用您的示例时出现以下错误:错误:未捕获的异常:ReferenceError:未定义时刻:@(shell):2:9 DBQuery.prototype.forEach@src/mongo/shell/query.js:494:9 @(shell):1:1
    • 使用load("moment.js"),见load()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2011-12-16
    • 2014-05-24
    相关资源
    最近更新 更多