【问题标题】:Convert String to date or ISODate using Mongo Shell in MongoDB在 MongoDB 中使用 Mongo Shell 将字符串转换为日期或 ISODate
【发布时间】:2017-09-04 22:17:47
【问题描述】:

我在 MongoDB 中有数千个对象。我有一个名为“Insert_Date”的字段,其字符串格式为:“DD-Month(eg.JUN)-YYYY hh:mm”。我想使用 mongo shell 将其转换为 Date 或 ISODate 我试过这个,但它显示错误“无效的 ISO 日期”

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

是否有另一种方法可以使用正则表达式进行转换? 任何帮助都会得到帮助。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    这是使用“01-JUN-2009 00:00”作为日期值的一种方法。

    首先,解析出时间值:

    db.dates.aggregate([
       {
        $project : {
            day: { $substr: [ "$Date_Time", 0, 2 ] },
            month: { $substr: [ "$Date_Time", 3, 3 ] },
            year: { $substr: [ "$Date_Time", 7, 4 ] },
            hour: { $substr: [ "$Date_Time", 12, 2 ] },
            minute: { $substr: [ "$Date_Time", 15, 2 ] }
            }
        },
        { $out : "dates" }
    ]);
    

    然后,将月份 MMM 字符串转换为 MM 数字,就像您在评论中提到的那样。 您需要使用 3.4 或更高版本才能使用 switch 语句:

    db.dates.aggregate( [
      {
        $project: {
            "day": "$day",
            "year": "$year",
            "hour": "$hour",
            "minute": "$minute",
            "month" :
            {
                $switch: { 
                    branches: [
                        { case: { $eq: [ "$month", "JAN" ] }, then: "01" },
                        { case: { $eq: [ "$month", "FEB" ] }, then: "02" },
                        { case: { $eq: [ "$month", "MAR" ] }, then: "03" },
                        { case: { $eq: [ "$month", "APR" ] }, then: "04" },
                        { case: { $eq: [ "$month", "MAY" ] }, then: "05" },
                        { case: { $eq: [ "$month", "JUN" ] }, then: "06" },
                        { case: { $eq: [ "$month", "JUL" ] }, then: "07" },
                        { case: { $eq: [ "$month", "AUG" ] }, then: "08" },
                        { case: { $eq: [ "$month", "SEP" ] }, then: "09" },
                        { case: { $eq: [ "$month", "OCT" ] }, then: "10" },
                        { case: { $eq: [ "$month", "NOV" ] }, then: "11" },
                        { case: { $eq: [ "$month", "DEC" ] }, then: "12" }
                    ]
                }
            }
          }
       },
       { $out : "dates" }
    ]);
    

    然后,您可以创建 MongoDB 将解释为日期的字符串:

    db.dates.find().forEach(function(doc) { 
        db.dates.update({_id: doc._id},{$set : {"Date_Time": doc.year + '-' + doc.month + '-' + doc.day + 'T' + doc.hour + ':' + doc.minute}});
    });
    

    最后一步是通过将字符串传递给 Date() 来构造 ISODate:

    db.dates.find().forEach(function(doc) { 
        doc.Date_Time=new Date(doc.Date_Time);
        db.dates.save(doc); 
    })
    

    【讨论】:

    • 您能提供一个具体的示例值吗?查看格式,您可能希望使用 $substr() 构建 Date() 的参数。
    • 这是对象"Insert_Date" : "01-JUN-2009 00:00" 中的一个字段,类型为字符串,我正在考虑先从 MMM 转换为 MM,因此它可能会将其识别为有效日期
    • 是的,您需要转换。响应会相应更新。
    • 谢谢,我刚刚尝试将大约 20 个对象转换为 Date 然后停止并显示错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多