[英]MongoDB: Aggregate with nested $group
我有以下查詢:
db.test.aggregate([
{
$match: {
'type': 'energy'
}
},
{
$limit: 10000
},
{
$addFields: {
day: {
$dateToString: {
date: "$when.date",
format: "%d/%m/%Y"
}
},
sensor: "$id"
},
},
{
$project: {
_id: 1,
sensor: 1,
when: 1,
value: 1,
day: 1
}
},
{
$group: {
_id: "$day",
data: {
$push: "$$ROOT"
},
}
},
{
$sort: {
'data': 1
}
}
])
返回此數據格式:
{ "_id" : "05/04/2018", "data" : [ { "_id" : ObjectId("5ac66be9b02d5c18fd4106c7"), "value" : 0, "when" : { "date" : ISODate("2018-04-05T13:53:22.703-03:00"), "unix" : 1522947202, "milli" : 1522947202703 }, "day" : "05/04/2018", "sensor" : "sen3" }, { "_id" : ObjectId("5ac66be9b02d5c18fd4106c8"), "value" : 0, "when" : { "date" : ISODate("2018-04-05T13:53:22.705-03:00"), "unix" : 1522947202, "milli" : 1522947202705 }, "day" : "05/04/2018", "sensor" : "sen4" } ] }, { "_id" : "06/04/2018", "data" : [ { "_id" : ObjectId("5ac7e5d2efe88a4e76c008d2"), "value" : 0, "when" : { "date" : ISODate("2018-04-06T18:25:38.885-03:00"), "unix" : 1523049938, "milli" : 1523049938885 }, "day" : "06/04/2018", "sensor" : "sen3" }, { "_id" : ObjectId("5ac7e5e4efe88a4e76c008d5"), "value" : 0, "when" : { "date" : ISODate("2018-04-06T18:25:56.105-03:00"), "unix" : 1523049956, "milli" : 1523049956105 }, "day" : "06/04/2018", "sensor" : "sen3" } ] },...
請注意,我們在每個“數據”文檔中都有不同類型的傳感器(sen3,sen4,...,senN)。
我試圖再次聚合這個結果,通過傳感器對數據進行聚合,得到如下輸出:
{ "_id" : "05/04/2018", "sen3" : [ { "_id" : ObjectId("5ac66be9b02d5c18fd4106c7"), "value" : 0, "when" : { "date" : ISODate("2018-04-05T13:53:22.703-03:00"), "unix" : 1522947202, "milli" : 1522947202703 }, "day" : "05/04/2018", "sensor" : "sen3" }, { "_id" : ObjectId("5ac66be9b02d5c18fd4106c7"), "value" : 0, "when" : { "date" : ISODate("2018-04-05T13:53:22.703-03:00"), "unix" : 1522947202, "milli" : 1522947202703 }, "day" : "05/04/2018", "sensor" : "sen3" } ], "sen4" : [ { "_id" : ObjectId("5ac66be9b02d5c18fd4106c8"), "value" : 0, "when" : { "date" : ISODate("2018-04-05T13:53:22.705-03:00"), "unix" : 1522947202, "milli" : 1522947202705 }, "day" : "05/04/2018", "sensor" : "sen4" }, { "_id" : ObjectId("5ac66be9b02d5c18fd4106c8"), "value" : 0, "when" : { "date" : ISODate("2018-04-05T13:53:22.705-03:00"), "unix" : 1522947202, "milli" : 1522947202705 }, "day" : "05/04/2018", "sensor" : "sen4" } ] }, { "_id" : "06/04/2018", "sen3" : [ { "_id" : ObjectId("5ac7e5d2efe88a4e76c008d2"), "value" : 0, "when" : { "date" : ISODate("2018-04-06T18:25:38.885-03:00"), "unix" : 1523049938, "milli" : 1523049938885 }, "day" : "06/04/2018", "sensor" : "sen3" }, { "_id" : ObjectId("5ac7e5e4efe88a4e76c008d5"), "value" : 0, "when" : { "date" : ISODate("2018-04-06T18:25:56.105-03:00"), "unix" : 1523049956, "milli" : 1523049956105 }, "day" : "06/04/2018", "sensor" : "sen3" } ], "sen4": [ { "_id" : ObjectId("5ac7e7a7efe88a4e76c008de"), "value" : 0, "when" : { "date" : ISODate("2018-04-06T18:33:27.365-03:00"), "unix" : 1523050407, "milli" : 1523050407365 }, "day" : "06/04/2018", "sensor" : "sen4" }, { "_id" : ObjectId("5ac7e7a7efe88a4e76c008de"), "value" : 0, "when" : { "date" : ISODate("2018-04-06T18:33:27.365-03:00"), "unix" : 1523050407, "milli" : 1523050407365 }, "day" : "06/04/2018", "sensor" : "sen4" } ] }
簡而言之:我想在幾天內將數據分組, 傳感器和每個傳感器內部的數據分別屬於當天和傳感器。
我正在嘗試創建一個嵌套的$group
但在所有試驗中它都會出錯。
這是可能的嗎和案例是,怎么樣?
您可以在mongodb 3.6及更高版本中嘗試以下聚合
db.collection.aggregate([
{ "$match": { "type": "energy" }},
{ "$limit": 10000 },
{ "$addFields": {
"day": { "$dateToString": { "date": "$when.date", "format": "%d/%m/%Y" }},
"sensor": "$id"
}},
{ "$project": { "_id": 1, "sensor": 1, "when": 1, "value": 1, "day": 1 }},
{ "$group": {
"_id": { "day": "$day", "sensor": "$sensor" },
"data": { "$push": "$$ROOT" }
}},
{ "$group": {
"_id": { "day": "$_id.day" },
"data": { "$push": { "k": "$_id.sensor", "v": "$data" }}
}},
{ "$addFields": { "data": { "$arrayToObject": "$data" }}},
{ "$replaceRoot": { "newRoot": { "$mergeObjects": [ "$_id", "$data" ] }}}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.