【发布时间】:2021-09-07 13:37:28
【问题描述】:
我有一个历史集合,并希望基于该集合创建导出数据库
[{
_id: "...",
value: 10,
at: ISODate("2021-24-06T00:01:02.023")
}, {
_id: ...,
value: 13,
at: ISODate("2021-24-06T00:04:11.211")
}, {
_id: ...,
value: 12,
at: ISODate("2021-24-06T09:11:31.182")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-07T01:33:31.723")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-15T09:32:44.983")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-16T10:43:22.083")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-16T14:43:22.083")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-17T04:25:12.021")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-18T20:13:22.083")
}, {
_id: ...,
value: 40,
at: ISODate("2021-24-19T18:41:22.083")
}]
我必须按小时、天、周公开 3 个选项组
我正在尝试使用 $group 来计算一天中的混合/最大值或平均值,但不知道如何将它们分组到每小时/每天/每周的数据中
我可以按 $cond 分组吗? 因为它对所有情况都非常灵活。
示例:按小时分组,第一时刻 = 2021-24-06T00:00:00.000 期望:
[{
at: ISODate("2021-24-06T00:00:00.000"),
max: 13,
min: 10,
avg: 21.5
}, {
at: ISODate("2021-24-06T01:00:00.000"),
}, ..., {
at: ISODate("2021-24-06T09:00:00.000"),
max: 12,
min: 12,
avg: 12
}]
分组依据 = 天
预期:
[{
at: ISODate("2021-24-06T00:00:00.000"),
max: 13,
min: 10,
avg: 11.7
}, {
at: ISODate("2021-24-07T00:00:00.000"),
max: 40,
min 40,
avg: 40,
}]
这是我的想法。创建每个组的第一个时刻,将at 与组的第一个时刻和最后一个时刻进行比较。
例如:按天分组,第一组的第一时刻在:ISODate("2021-24-06T00:00:00.000") -> 最后时刻 = ISODate("2021-24-06T23:59:59.999") -> 分组所有记录属于该组
第二组:ISODate("2021-24-06T00:00:00.000") + 1day = ISODate("2021-24-07T00:00:00.000") -> 最后时刻 = ISODate("2021-24-07T23:59:59.999") -> 组所有记录属于该组
但是如何实现
【问题讨论】:
-
使用 $bucket,预先计算您想要聚合的范围并明确传递它们。
-
@D.SM 哦,这似乎是个好建议。我会尝试并在下一条评论中报告
-
@D.SM 工作顺利,非常感谢
标签: node.js mongodb group-by aggregation