【问题标题】:Mongo: strings converted to date but not 'querable'Mongo:字符串转换为日期但不是“可查询的”
【发布时间】:2020-10-28 11:34:02
【问题描述】:

我有一个日期存储为字符串 YYYY-mm-DD_HH:MM:SS.UUUZ 的集合,例如 2020-10-20_12:15:22.123+0100

我的目标是查询将这些字符串视为日期的字符串。

我在做什么: 我正在展开多个文档上的一些标题数据:

    {
            "$unwind": {
                "path": "$events",
                "preserveNullAndEmptyArrays": true
            }
        }

还有

    {
            "$unwind": {
                "path": "$events.hi2",
                "preserveNullAndEmptyArrays": true
            }
}

我正在添加一个用解析为日期的字符串创建的新字段

    {
            "$addFields": {
                "events.hi2.ConnectTimets": {
                    "$dateFromString": {
                        "dateString": "$events.hi2.ConnectTime",
                        "format": "%Y-%m-%d_%H:%M:%S.%L%Z"
                    }
                }
    }}

然后在$match 阶段,我尝试过滤所有日期早于 2020 年 6 月 1 日的记录:

    {
            "$match":{
                "events.hi2.ConnectTimets": {
                                    "$gt": {"$dateFromString": {
                                                "dateString": "2020-06-01",
                                                "format": "%Y-%m-%d"
                                                 }
                                             }
                                }
                }   
         }

我的结果是Fetched 0 record(s) in 0ms

即使数据库中存在(至少一个文档)且日期与过滤器匹配:

    {
        "_id" : ObjectId("5f438dfbf1feb13c4352e9f4"),
        "timestamp" : NumberLong(1598262779045),
        "attribute1" : [ 
            "common"
        ],
        "events" : [ 
            {
                "eventType" : "ty1",
                "timestamp" : NumberLong(1598262779018),
                "docId" : NumberLong(282578800148736),
                "hi2" : {
                    "Priority" : 3,
                    "ClientId" : "client1",
                    "ConnectTime" : "2020-08-24_09:52:58.993+0000",
                    "Direction" : 1
                }
            },
            {
                "eventType" : "ty2",
                "timestamp" : NumberLong(1598262781071),
                "docId" : NumberLong(282578800148736),
                "hi2" : {
                    "ref" : "bbbb"
                    
                }
            }
        ]  
    }

当我想到类似的东西时

    {
            "_id" : ObjectId("5f438dfbf1feb13c4352e9f4"),
            "timestamp" : NumberLong(1598262779045),
            "attribute1" : [ 
                "common"
            ],
            "events" : [ 
                {
                    "eventType" : "ty1",
                    "timestamp" : NumberLong(1598262779018),
                    "docId" : NumberLong(282578800148736),
                    "hi2" : {
                        "Priority" : 3,
                        "ClientId" : "client1",
                        "ConnectTime" : "2020-08-24_09:52:58.993+0000",
                        "Direction" : 1
                 }
    }
    }

注意_:添加字段是可以的,因为如果我在没有匹配阶段的情况下触发它,则会输出一个字符串解析为日期的字段

【问题讨论】:

    标签: string mongodb date


    【解决方案1】:

    您应该从不将日期/时间值存储为字符串,始终使用正确的 Date 对象。 那么查询就简单多了:

    db.logging.aggregate([
       {
          $addFields: {
             "events.hi2.ConnectTimets": {
                $dateFromString: {
                   dateString: "$events.hi2.ConnectTime",
                   format: "%Y-%m-%d_%H:%M:%S.%L%Z"
                }
             }
          }
       },
       { $match: { "events.hi2.ConnectTimets": { $gte: ISODate("2020-06-01") } } }
    ])
    

    当您必须使用日期/时间值时,我推荐moment.js。然后您的查询可能如下所示:

    { $match: { "events.hi2.ConnectTimets": { $gte: moment("2020-06-01").toDate() } } }
    { $match: { "events.hi2.ConnectTimets": { $gte: moment("2020-06-01").tz('Europe/Zurich').toDate() } } }
    { $match: { "events.hi2.ConnectTimets": { $lte: moment.tz('Europe/Zurich').endOf('day').toDate() } } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多