Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB:使用嵌套的$group进行聚合_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

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" ] }}}
])