Node.js MongoDB:使用嵌套的$group进行聚合
我有以下疑问:Node.js MongoDB:使用嵌套的$group进行聚合,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有以下疑问: db.test.aggregate([ { $match: { 'type': 'energy' } }, { $limit: 10000 }, { $addFields: { day: { $dateToString: { date: "$when.dat
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”:“2018年4月5日”,
“数据”:[
{
“_id”:ObjectId(“5ac66be9b02d5c18fd4106c7”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-05T13:53:22.703-03:00”),
“unix”:1522947202,
“毫”:1522947202703
},
“日期”:“2018年4月5日”,
“传感器”:“传感器3”
},
{
“_id”:ObjectId(“5ac66be9b02d5c18fd4106c8”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-05T13:53:22.705-03:00”),
“unix”:1522947202,
“毫”:1522947202705
},
“日期”:“2018年4月5日”,
“传感器”:“传感器4”
}
]
},
{
“_id”:“2018年4月6日”,
“数据”:[
{
“_id”:ObjectId(“5ac7e5d2efe88a4e76c008d2”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-06T18:25:38.885-03:00”),
“unix”:1523049938,
“毫”:1523049938885
},
“日期”:“2018年4月6日”,
“传感器”:“传感器3”
},
{
“_id”:ObjectId(“5ac7e5e4efe88a4e76c008d5”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-06T18:25:56.105-03:00”),
“unix”:1523049956,
“毫”:1523049956105
},
“日期”:“2018年4月6日”,
“传感器”:“传感器3”
}
]
},
。。。
请注意,我们在每个“数据”文档中都有不同类型的传感器(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"
}
]
}
{
“_id”:“2018年4月5日”,
“sen3”:[
{
“_id”:ObjectId(“5ac66be9b02d5c18fd4106c7”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-05T13:53:22.703-03:00”),
“unix”:1522947202,
“毫”:1522947202703
},
“日期”:“2018年4月5日”,
“传感器”:“传感器3”
},
{
“_id”:ObjectId(“5ac66be9b02d5c18fd4106c7”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-05T13:53:22.703-03:00”),
“unix”:1522947202,
“毫”:1522947202703
},
“日期”:“2018年4月5日”,
“传感器”:“传感器3”
}
],
“sen4”:[
{
“_id”:ObjectId(“5ac66be9b02d5c18fd4106c8”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-05T13:53:22.705-03:00”),
“unix”:1522947202,
“毫”:1522947202705
},
“日期”:“2018年4月5日”,
“传感器”:“传感器4”
},
{
“_id”:ObjectId(“5ac66be9b02d5c18fd4106c8”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-05T13:53:22.705-03:00”),
“unix”:1522947202,
“毫”:1522947202705
},
“日期”:“2018年4月5日”,
“传感器”:“传感器4”
}
]
},
{
“_id”:“2018年4月6日”,
“sen3”:[
{
“_id”:ObjectId(“5ac7e5d2efe88a4e76c008d2”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-06T18:25:38.885-03:00”),
“unix”:1523049938,
“毫”:1523049938885
},
“日期”:“2018年4月6日”,
“传感器”:“传感器3”
},
{
“_id”:ObjectId(“5ac7e5e4efe88a4e76c008d5”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-06T18:25:56.105-03:00”),
“unix”:1523049956,
“毫”:1523049956105
},
“日期”:“2018年4月6日”,
“传感器”:“传感器3”
}
],
“sen4”:[
{
“_id”:ObjectId(“5ac7e7a7efe88a4e76c008de”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-06T18:33:27.365-03:00”),
“unix”:152305407,
“毫”:1523050407365
},
“日期”:“2018年4月6日”,
“传感器”:“传感器4”
},
{
“_id”:ObjectId(“5ac7e7a7efe88a4e76c008de”),
“值”:0,
“何时”:{
“日期”:ISODate(“2018-04-06T18:33:27.365-03:00”),
“unix”:152305407,
“毫”:1523050407365
},
“日期”:“2018年4月6日”,
“传感器”:“传感器4”
}
]
}
简而言之:我想将数据按天、传感器分组,并在每个传感器内将属于当天和传感器的结果分组
我试图创建一个嵌套的$组
,但在所有情况下都出错了
这可能吗?是的,怎么做?您可以在mongodb3.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" ] }}}
])
它完美地解决了这个问题。但是输出没有按日期(天)或传感器给出订单。当我在末尾添加{$sort:{'day':1}}时,它按字符串day的第一个元素排序,而不是按日期排序。有没有办法使它正确?Thx人!您希望哪一天
$sort
?在sen
数组内部?我只想按sen数组外部的day元素排序。无论如何,这种实现已经足够了。非常感谢。
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" ] }}}
])