$ project之后的Mongo总匹配日期范围,查询速度

时间:2019-10-03 17:28:43

标签: mongodb

我需要更改查询中的时区匹配,以便可以根据EST和PST查看结果。传入日期是一个ISO日期。因此,我进行了以下操作以查看时区:

示例记录:

{
    "_id" : ObjectId("5ce5d5cf912f4714386a4c19"),
    "orderDate" : ISODate("2017-10-08 14:29:43.000Z"),
    "fieldlbl1" : 1234,
}
db.getCollection('example1').aggregate(
   [
     {
       $project: {
          fieldlbl1:1,
          orderDate:1,
          timewithOffsetNY: { $dateToString: { date: "$orderDate", timezone: "America/New_York"} },
          timewithOffsetCA: { $dateToString: { date: "$orderDate", timezone: "America/Los_Angeles" } },
       }
     }
   ]
)

然后我尝试进行比赛,但结果始终为空。请注意,具有相同日期的常规查询有效

db.getCollection('example1').aggregate(
   [
     {
       $project: {
          fieldlbl1:1,
          orderDate:1,
          timewithOffsetNY: { $dateToString: { date: "$orderDate", timezone: "America/New_York"} },
          timewithOffsetCA: { $dateToString: { date: "$orderDate", timezone: "America/Los_Angeles" } },
       }
     },
    {
      $match: {
          fieldlbl1: 1234,
          timewithOffsetCA: {
              $gte: ISODate('2017-10-08 00:00:00.000Z'), 
              $lte: ISODate('2017-10-08 23:59:59.999Z')
         }
      }
    }
   ]
)

我尝试将ISODate更改为new Date,但还是没有运气。即使我将字符串指定为日期,也知道mongo为什么找不到日期。

更新

第二次使用$project,然后使用$toDate似乎可行,但是由于有如此多的结果,查询需要花费很多时间。像下面这样嵌套转换仍然需要花费永久时间(3.22秒)

     {
       $project: {
          fieldlbl1:1,
          orderDate:1,
          timewithOffsetNY: { $toDate: { $dateToString: { date: "$orderDate", timezone: "America/New_York"} } },
          timewithOffsetCA: { $toDate: { $dateToString: { date: "$orderDate", timezone: "America/Los_Angeles" } } },
       }
     },

对相同数据的常规查询仅需0.008秒

db.getCollection('example1').find({fieldlbl1: 1234, orderDate: {$gte: ISODate('2017-10-08 00:00:00.000Z'), $lte: ISODate('2017-10-08 23:59:59.999Z')}}).sort({orderDate: -1})

也许更好的问题是,我该如何更快地回答与原始查询相同的问题?

0 个答案:

没有答案