Mongo 每天汇总 $group?
Mongo aggregate $group by each day?
我有一个历史集合,想基于该集合创建导出数据库
[{
_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 来计算 mix/max 或一天的平均值,但不知道如何将它们 $group 到每个 hour/day/weeks 数据
我可以按 $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")
-> 组所有记录属于该组
但是如何实现呢
您可以在 Group By $group
子句中使用 $dateToString
根据 Day
和 Hour
对数据进行分组。您可以在 Group By $group
子句中使用 $week
根据 Week
.
对数据进行分组
请看下面的代码:
示例数据
按周分组
db.collData.aggregate([
{
$group : {
_id : { $week: '$at' },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])
按天分组
db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%d", date: "$at" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])
按小时分组
db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%dT%H", date: "$at" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])
See more details about the $group
See more details about the $dateToString
See more details about the $week
在查询中使用时区更新
您可以在 $dateToString
表达式中使用 timezone
。请检查以下示例:
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 }
}
])
您将在下面的 link 中找到有关表达式的更多信息,包括 timezone
.
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 }
}
])
我有一个历史集合,想基于该集合创建导出数据库
[{
_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 来计算 mix/max 或一天的平均值,但不知道如何将它们 $group 到每个 hour/day/weeks 数据
我可以按 $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")
-> 组所有记录属于该组
但是如何实现呢
您可以在 Group By $group
子句中使用 $dateToString
根据 Day
和 Hour
对数据进行分组。您可以在 Group By $group
子句中使用 $week
根据 Week
.
请看下面的代码:
示例数据
按周分组
db.collData.aggregate([
{
$group : {
_id : { $week: '$at' },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])
按天分组
db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%d", date: "$at" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])
按小时分组
db.collData.aggregate([
{
$group : {
_id : { $dateToString: { format: "%Y-%m-%dT%H", date: "$at" } },
averageValue: { $avg: "$value" },
count: { $sum: 1 }
}
},
{
$sort : { averageValue: -1 }
}
])
See more details about the $group
See more details about the $dateToString
See more details about the $week
在查询中使用时区更新
您可以在 $dateToString
表达式中使用 timezone
。请检查以下示例:
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 }
}
])
您将在下面的 link 中找到有关表达式的更多信息,包括 timezone
.
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 }
}
])