我需要在管道中执行具有第一个$match
阶段的聚合查询:
match_stage = {
'$match': {
'path': {'$in': locations},
'date': {
'$or': {
[
{'$gte': range_a_start, '$lte': range_a_end},
{'$gte': range_b_start, '$lte': range_b_end},
]
}
}
}
}
基本上我需要将文档匹配到两个日期范围,并根据ISODate
字段执行一些基于日期的聚合,但是之后需要执行$project
我应该确定文档是否来自匹配range_a
或range_b
。
我不确定如何实现这一目标。我见过那里的$bucket
运营商,但到目前为止我运气不好。
答案 0 :(得分:1)
继Veeram建议使用项目阶段之后:
// Project some fields to tell us which range.
isInFirstRange: { $cond: { if: {$and:[{'$gte': ["$date", range_a_start]},{'$lte': ["$date", range_a_end]}]}, then: true, else: false } }
isInSecondRange: { $cond: { if: {$and:[{'$gte': ["$date", range_b_start]},{'$lte': ["$date", range_b_end]}]}, then: true, else: false } }
这些方面的东西......
编辑:投影是您要创建“虚拟”字段的位置,其中包含基于实际字段和/或公式等的值。例如,如果您有一个半径为3的圆,则只能保存半径到DB并将其区域“投影”为pi * 9.区域不保存在DB中。预计在预测阶段。阅读更多here。