Как агрегировать данные временных рядов при группировании по другому полю в MongoDB? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть документы, которые выглядят следующим образом:

{u'memory_virtual': {u'percent': 55.6}, u'name': u'Device #1', u'datetime': datetime.datetime(2019, 2, 16, 17, 52, 18)}
{u'memory_virtual': {u'percent': 55.6}, u'name': u'Device #2', u'datetime': datetime.datetime(2019, 2, 16, 17, 52, 16)}
{u'memory_virtual': {u'percent': 55.7}, u'name': u'Device #1', u'datetime': datetime.datetime(2019, 2, 16, 17, 46, 56)}
{u'memory_virtual': {u'percent': 55.7}, u'name': u'Device #2', u'datetime': datetime.datetime(2019, 2, 16, 17, 46, 54)}
{u'memory_virtual': {u'percent': 55.7}, u'name': u'Device #1', u'datetime': datetime.datetime(2019, 2, 16, 17, 41, 34)}
{u'memory_virtual': {u'percent': 55.7}, u'name': u'Device #2', u'datetime': datetime.datetime(2019, 2, 16, 17, 41, 32)}

Я использовал следующий групповой этап для объединения данных в 15-минутные интервалы:

{
    '$group': {
        "_id": {
            "$toDate": {
                "$subtract": [
                    {"$toLong": "$datetime"},
                    {"$mod": [{"$toLong": "$datetime"}, 1000 * 60 * 15]}
                ]
            }
        },
        'mean': {'$avg': '$memory_virtual.percent'}
    },
}

С выводомэто выглядит так:

{u'_id': datetime.datetime(2019, 2, 16, 18, 0), u'mean': 26.10909090909091}
{u'_id': datetime.datetime(2019, 2, 16, 17, 45), u'mean': 28.98695652173913}

У меня вопрос, как мне также получить это для группировки по полю 'name'?Так что я получу вывод, который выглядит следующим образом:

{u'_id': datetime.datetime(2019, 2, 16, 18, 0), u'name': 'Device #1', u'mean': 26}
{u'_id': datetime.datetime(2019, 2, 16, 18, 0), u'name': 'Device #2', u'mean': 27}
{u'_id': datetime.datetime(2019, 2, 16, 17, 45), u'name': 'Device #1', u'mean': 27}
{u'_id': datetime.datetime(2019, 2, 16, 17, 45), u'name': 'Device #2', u'mean': 28}

Я не уверен, имеет ли это значение, но для справки я использую pymongo.

1 Ответ

0 голосов
/ 17 февраля 2019

Вам необходимо включить name также в _id из $group stage

{
    "$group": {
        "_id": {
            date: {
                "$toDate": {
                    "$subtract": [
                        {"$toLong": "$datetime"},
                        {"$mod": [{"$toLong": "$datetime"}, 1000 * 60 * 15]}
                    ]
                }
            },
            name: "$name"
        },
        "mean": {"$avg": "$memory_virtual.percent"}
    }
}
...