日期范围不适用于聚合管道,但适用于 find()
Date range not working in aggregation pipeline, but works in find()
我正在尝试按日期范围过滤数据。示例 return 不超过 14 天前创建的数据。
我可以通过以下方式在查找中执行此操作:
{
$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"
}
}
但是 return 没有数据结果。如果我删除日期,我会根据 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'
如有任何见解,我们将不胜感激
我能够通过 toDate 让它工作:
{
$match:
{
$expr:
{
$and:
[
{ $eq: ["$patientId", patientId] },
{ $eq: ["$dataId", "iraeOverallAlert"] },
{ "$gte": [ {$toDate: "$eventTime"}, startTime.toDate()] },
{ "$lte": [ {$toDate: "$eventTime"}, endTime.toDate()] },
]
}
}
},
注意:这在查找中不需要,但在某种程度上需要使用聚合。没有任何意义,但是是为了反复试验。
我正在尝试按日期范围过滤数据。示例 return 不超过 14 天前创建的数据。
我可以通过以下方式在查找中执行此操作:
{
$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"
}
}
但是 return 没有数据结果。如果我删除日期,我会根据 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'
如有任何见解,我们将不胜感激
我能够通过 toDate 让它工作:
{
$match:
{
$expr:
{
$and:
[
{ $eq: ["$patientId", patientId] },
{ $eq: ["$dataId", "iraeOverallAlert"] },
{ "$gte": [ {$toDate: "$eventTime"}, startTime.toDate()] },
{ "$lte": [ {$toDate: "$eventTime"}, endTime.toDate()] },
]
}
}
},
注意:这在查找中不需要,但在某种程度上需要使用聚合。没有任何意义,但是是为了反复试验。