日期和时间过滤器在 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 之前的操作系统版本中工作正常

minDate:0,不在datepicker中工作

VOIP 服务不能在生产环境中工作,但在测试服务器中工作正常

时间过滤器快捷方式如何在 KIbana 中工作?

函数在代码中工作,但不能作为工作表中的 UDF