我需要更改查询中的时区匹配,以便可以根据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})
也许更好的问题是,我该如何更快地回答与原始查询相同的问题?