日期和时间过滤器在 find() 操作中工作正常,但 $match 与 mongodb 中的聚合出现问题
Posted
技术标签:
【中文标题】日期和时间过滤器在 find() 操作中工作正常,但 $match 与 mongodb 中的聚合出现问题【英文标题】:Date and Time filter working fine with find() operation but issues with $match with aggregate in mongodb 【发布时间】:2019-03-31 04:14:42 【问题描述】:我正在构建动态查询如下:
if(DateX && DateY)
query.createdAt =
$gte: new Date(DateX).toISOString(),
$lt : new Date(DateY).toISOString()
else if(DateX)
query.createdAt =
$gte: new Date(DateX).toISOString()
else if(DateY)
query.createdAt =
$lt: new Date(DateY).toISOString()
这里我的日期 DateX 和 DateY 是 tz 格式的日期。
上面的查询使用 find() 可以正常工作,如下所示并返回所需的结果:
Model.find(query).lean().exec();
但同样的查询不适用于aggregate.match(query)
,如下所示:
Model.aggregate()
.match(query)
.exec()
【问题讨论】:
【参考方案1】:我试图将 new Date(DateX)
和 new Date(DateY)
转换为 ISO 格式的日期时间字符串,这在此处不起作用。由于new Date()
构造函数本身返回具有指定日期的ISODate
。
我刚刚从new Date().toISOString()
中删除了.toISOString()
,它开始正常工作。
根据 mongodb 官方文档says:
new Date("") 返回具有指定日期的 ISODate。
new Date("") 在中指定日期时间 客户端的本地时区并返回指定的 ISODate UTC 日期时间。
new Date("") 以 UTC 格式指定日期时间 并以 UTC 格式返回具有指定日期时间的 ISODate。
new Date() 以毫秒为单位指定日期时间 Unix 纪元(1970 年 1 月 1 日),并返回生成的 ISODate 实例。
【讨论】:
以上是关于日期和时间过滤器在 find() 操作中工作正常,但 $match 与 mongodb 中的聚合出现问题的主要内容,如果未能解决你的问题,请参考以下文章
向量查找函数在 Visual Studio 中工作但在 GCC 中不工作
在 iOS 7.1 更新中自动释放的变量崩溃,但在 iOS 7.1 之前的操作系统版本中工作正常