Py学习  »  MongoDB

如何在MongoDB中按其他字段分组时聚合时间序列数据?

Pathead • 4 年前 • 412 次点击  

我有文件看起来像:

{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。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/54682
 
412 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Saravana
Reply   •   1 楼
Saravana    5 年前

你需要包括 name 也在 _id 属于 $group

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