基于时间值的MongoDB嵌套聚合
我有一个这样的结构来自物联网传感器设备基于时间值的MongoDB嵌套聚合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个这样的结构来自物联网传感器设备 [{ "_id" : ObjectId("5e8e1af3f1563046e084cf65"), "value" : 462.2382850719, "start" : 1586293200001, "year" : 2020, "month" : "04", "day" : "07", "hour" : "21", "channelId" : 3462 }, { "_id" : O
[{
"_id" : ObjectId("5e8e1af3f1563046e084cf65"),
"value" : 462.2382850719,
"start" : 1586293200001,
"year" : 2020,
"month" : "04",
"day" : "07",
"hour" : "21",
"channelId" : 3462
},
{
"_id" : ObjectId("5e8e1af3f1563046e084cf64"),
"value" : 1636.8770905333,
"start" : 1586289600001,
"year" : 2020,
"month" : "04",
"day" : "07",
"hour" : "19",
"channelId" : 3462
},
{
"_id" : ObjectId("5e8e1af3f1563046e084cf63"),
"value" : 1665.4116577475,
"start" : 1586286000001,
"year" : 2020,
"month" : "04",
"day" : "07",
"hour" : "20",
"channelId" : 3462
}]
我想先按channelId对这个结构进行分组,然后按年、月、日和小时进行分组。我想开发这种嵌套结构
{"channel_id":XXX,"aggregates":[2020:[04:[01:[00:AVG_VALUE,01:AVG_VALUE...],...],...]}
像这样
output = [
{
channelId: 3462,
"value": '',
aggregates: [
{
year: 2020,
months: [
{
month: 4,
value: '',
days: [
{
day: 7,
value: '',
hours: [
{ hour: 19, value: '' },
{ hour: 20, value: '' },
{ hour: 21, value: '' }
]
}
]
}
]
}
]
}
]
我可以做一个级别的$group by,然后将$$ROOT推入其中,但不知道如何与组嵌套。我是否必须使用reduce逻辑或任何
需要帮助检查解决方案是否满足您的要求:
db.collection.aggregate([
{
$group: {
_id: {
"channelId": "$channelId",
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour"
},
value: {
$avg: "$value"
}
}
},
{
$group: {
_id: {
"channelId": "$_id.channelId",
"year": "$_id.year",
"month": "$_id.month",
"day": "$_id.day"
},
value: {
$avg: "$value"
},
hours: {
$push: {
hour: "$_id.hour",
value: "$value"
}
}
}
},
{
$group: {
_id: {
"channelId": "$_id.channelId",
"year": "$_id.year",
"month": "$_id.month"
},
value: {
$avg: "$value"
},
days: {
$push: {
day: "$_id.day",
value: "$value",
hours: "$hours"
}
}
}
},
{
$group: {
_id: {
"channelId": "$_id.channelId",
"year": "$_id.year"
},
value: {
$avg: "$value"
},
months: {
$push: {
month: "$_id.month",
value: "$value",
days: "$days"
}
}
}
},
{
$group: {
_id: {
"channelId": "$_id.channelId"
},
channelId: {
$first: "$_id.channelId"
},
value: {
$avg: "$value"
},
aggregates: {
$push: {
year: "$_id.year",
value: "$value",
months: "$months"
}
}
}
},
{
$project: {
_id: 0
}
}
])
您可以在多个字段上分组;在本例中,“年”、“月”等。如何对它们进行嵌套分组?
{$group:{{id:{“年”:“$year”,“month”:“$month”,…},平均:{……
我希望年只包含当年的月份,而月份只包含当月的天数,依此类推。2020“[{”04:[{”07:[{“21”:{},{“19”:{}]}]。不一定要将它们作为键。它可以是键-值对。您能否编辑您的帖子并添加输出文档的外观示例。是的,您能否解释一下该值与平均值的相同程度。@GhazanfarKhan如果您一步一步地执行聚合,您可以看到我们是如何构造结构的。AVG是计算的通常,要用MongoDB聚合构建这样的结构,我们需要从底部->顶部开始。