gpt4 book ai didi

node.js - Mongo 每天汇总 $group 吗?

转载 作者:行者123 更新时间:2023-12-03 08:20:05 25 4
gpt4 key购买 nike

我有一个历史记录集合,并希望基于该集合创建导出数据库

[{
_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 来计算一天内的混合/最大或平均值,但不知道如何将它们 $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") -> 对属于该组的所有记录进行分组

但是如何实现

最佳答案

您可以使用$dateToString在组中$group子句根据 Day 对数据进行分组& Hour 。您可以使用$week在组中$group子句根据 Week 对数据进行分组.

请看一下下面的代码:

示例数据 Sample Data

按周分组

db.collData.aggregate([
{
$group : {
_id : { $week: '$at' },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

Group By Week

按天分组

db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%d", date: "$at" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

Group By Day

按小时分组

db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%dT%H", date: "$at" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

Group By Hour

See more details about the $group

See more details about the $dateToString

See more details about the $week

在查询中使用时区进行更新

您可以使用timezone$dateToString表达。请检查以下示例:

Time Zone added in the group by

db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%d", date: "$at", timezone: "-05:00" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%d", date: "$at", timezone: "+07:00" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

您将在下面的链接中找到有关表达式的更多信息,包括 timezone .

MongoDB $dateToString

<强> timezone在小时示例中添加:

db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%dT%H", date: "$at", timezone: "+00:30" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

<强> timezone在周示例中添加:

db.collData.aggregate([
{
$group : {
_id : { $week: { date: '$at', timezone: "-05:00" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])

关于node.js - Mongo 每天汇总 $group 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68109302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com