如何干净地访问pymongo中深埋的字段?

时间:2017-01-09 18:09:03

标签: mongodb pymongo

我的文档以sysstat.host.statistics.timestamp[].cpu-load-all.cpu[].usr格式存储,其中timestamp是30个元素数组,cpu是1-64个元素数组。

enter image description here

如果我抓住timestamp字段,

timestampCursor = HOST_USAGE.find(
   {'sysstat.host.nodename': host}, 
   {'sysstat.host.statistics.timestamp': 1})

如何干净利落地访问sysstat.host.statistics.timestamp[*].cpu-load-all.cpu[0].usr?我是否必须通过索引每个数组来访问每个字段,因此在每个数组字段上进行多次迭代?

1 个答案:

答案 0 :(得分:2)

是的,您必须通过索引每个数组来访问每个字段,因此对每个数组字段进行多次迭代。

for doc in timestampCursor:
    sysstat = doc['sysstat']
    for ts in sysstat['host']['statistics']['timestamp']:
        for cpu in ts['cpu-load-all']['cpu']:
            usr = cpu['usr']
            # Now, sum or average the 'usr' values, or whatever
            # you intend to do.

或者,要聚合数据服务器端,您可以将$ unwind与$ sum或$ average或其他分组操作一起使用MongoDB聚合框架。

HOST_USAGE.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'}
    }
}])))