日期范围在聚合管道中不起作用,但在 find() 中起作用

Posted

技术标签:

【中文标题】日期范围在聚合管道中不起作用,但在 find() 中起作用【英文标题】:Date range not working in aggregation pipeline, but works in find() 【发布时间】:2019-12-19 12:02:25 【问题描述】:

我正在尝试按日期范围过滤数据。示例返回不超过 14 天前创建的数据。

我可以在 find 中执行以下操作:


    $match: 
        eventTime:  $gte: startTime.toDate(), $lte: endTime.toDate() 
    

eventTime 是一个 ISO 日期以及 startTime 和 endTime

我正在使用聚合和查找并尝试实现相同的东西:


            $lookup:
            
                from: "data",
                let:  dataId: "$dataId", patientId: "$patientId" ,
                pipeline: [
                    
                        $match:
                        
                            $expr:
                            
                                $and:
                                    [
                                         $eq: ["$patientId", patientId] ,
                                         $eq: ["$dataId", "$$dataId"] ,
                                         $gte: ["$eventTime", startTime.toDate()] ,
                                         $lte: ["$eventTime", endTime.toDate()] ,
                                    ]
                            
                        
                    
                ],
                as: "data"
            
        

但是没有返回任何数据结果。如果我删除日期,我会根据 dataId 和患者获得所有正确的数据。所以加入工作..但不知何故日期范围不是。

同样,eventTime 和 startTime 和 endTime 都是 ISO 日期。 示例:

let endTime = Moment(new Date());
let startTime = Moment().subtract(days, "days");

"eventTime": "2019-08-07T03:37:40.738Z"

 startTime  "2019-07-30T00:02:11.611Z"
 endTime  "2019-08-13T00:02:11.610Z"

End time is 'today' 
so in the example here the data time is between the two dates and should be returned.

我看过了:https://docs.mongodb.com/manual/reference/operator/aggregation/gte/ 它应该可以工作..但不是这样

我试过了:

eventTime:  '$gte': new Date(startTime), $lte: new Date(endTime)
and I get:
MongoError: An object representing an expression must have exactly one field:  $gte: new Date(1564495211043), $lte: new Date(1565704811042) 

也试过了:

 eventTime: '$gte': new Date(startTime)

and get:

MongoError: Expression $gte takes exactly 2 arguments. 1 were passed in.

也试过了:

 $eventTime: '$gte': new Date(startTime), $eventTime: '$lte': new Date(endTime)

and get: MongoError: Unrecognized expression '$eventTime'

任何见解都会受到赞赏

【问题讨论】:

你放的结束时间是什么时候? 你不认为 $gte 和 $lte 查询会出现在一个对象中,如你的第一个查询所示......你在查找查询中使用了它们在单独的对象中 我添加了结束时间。我无法弄清楚如何将它们组合成“和”内的单个查询..由于某种原因,文档将它们显示为单独的。 您确定事件时间是 iso 日期对象而不是 iso 字符串吗? 试试这个 $and: [$eventTime: '$gte': new Date(startTime), $eventTime: '$lte': new Date(endTime)] 【参考方案1】:

我能够通过 toDate 让它工作:


                        $match:
                        
                            $expr:
                            
                                $and:
                                    [
                                         $eq: ["$patientId", patientId] ,
                                         $eq: ["$dataId", "iraeOverallAlert"] ,
                                         "$gte": [ $toDate: "$eventTime", startTime.toDate()] ,
                                         "$lte": [ $toDate: "$eventTime", endTime.toDate()] ,

                                    ]
                            
                        
                    ,

注意:在查找中不需要这样做,但在某种程度上需要使用聚合。没有任何意义,但要反复试验。

【讨论】:

以上是关于日期范围在聚合管道中不起作用,但在 find() 中起作用的主要内容,如果未能解决你的问题,请参考以下文章

查找聚合中的管道在 mongodb 中不起作用

在聚合管道中设置条件在 mongodb 中不起作用

Jquery 日期规则在 Firefox 和 IE 中不起作用

输入类型=“日期”在某些浏览器中不起作用

JQuery UI 日期选择器在 Chrome 中不起作用

$.extend 中的 AJAX 函数在 jQuery 3 中不起作用