在pymongo中使用$ group聚合器投影其他字段

时间:2017-01-09 20:35:31

标签: mongodb pymongo

我有以下查询:

HOST_USAGE.aggregate([{
    '$match': {'sysstat.host.nodename': host}
    }, {
        '$project': {'ts': '$sysstat.host.statistics.timestamp'}
    }, {
        '$unwind': '$ts'
    }, {
        '$unwind': '$ts.cpu-load-all.cpu'
    }, {
        '$group': {
            '_id': 0,
            'all-usr': {'$max': '$ts.cpu-load-all.cpu.usr'}
        }
    }])

但是,还有一个我想抓住的字段$sysstat.host.statistics.timestamp[*].time

enter image description here

我试过了,

'$group': {
    '_id': 0,
    'all-usr': {'$max': '$ts.cpu-load-all.cpu.usr'},
    'time': '$ts.time'
}

但这会产生错误:pymongo.errors.OperationFailure: exception: the group aggregate field 'time' must be defined as an expression inside an object。我如何$group某些字段,并将其他字段投影到返回的数据集中?

1 个答案:

答案 0 :(得分:1)

如果您要对任何字段进行分组,则必须对所有字段进行分组。您可以使用$ push或$ addToSet来获取时间戳数组:

HOST_USEAGE.aggregate([{
    '$match': {'sysstat.host.nodename': 1}
}, {
    # Rename the field for brevity.
    '$project': {'ts': '$sysstat.host.statistics.timestamp'}
}, {
    '$unwind': '$ts'
}, {
    '$unwind': '$ts.cpu-load-all.cpu'
}, {
    '$group': {
        '_id': 0,
        'all-usr': {'$sum': '$ts.cpu-load-all.cpu.usr'},
        'times': {'$addToSet': '$ts.time'}
    }
}])))

我建议使用$addToSet以避免输出数组中的重复次数:$push每次“cpu-load-all”条目都会给出一个副本,因为$ unwind的工作方式。

相关问题