首页 > 解决方案 > 日期范围在聚合管道中不起作用,但在 find() 中起作用

问题描述

我正在尝试按日期范围过滤数据。示例返回不超过 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'

任何见解肯定会受到赞赏

标签: mongodbaggregation

解决方案


我能够通过 toDate 让它工作:

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

                                    ]
                            }
                        }
                    },

注意:这在查找中不需要,但不知何故需要使用聚合。没有任何意义,但要反复试验。


推荐阅读