MongoDB: агрегат с вложенной группой $ - PullRequest
0 голосов
/ 26 августа 2018

У меня есть следующий запрос:

 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"
       }
    ]
},</p>

<p>...

Обратите внимание, что у нас есть в каждом документе «данных»,различные типы датчиков (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"
        }
    ]
}

Короче: Iхочу сгруппировать данные по дням , датчикам и внутри каждого датчика результатов, относящихся к этому дню и датчику.

Япытается создать вложенный $group, но во всех случаях это не так.

Можно ли это сделать, и если да, то как?

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете попробовать ниже агрегации в 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" ] }}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...