日期范围在聚合管道中不起作用,但在 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() 中起作用的主要内容,如果未能解决你的问题,请参考以下文章