2017-01-09 25 views
1

我的文档存储格式为sysstat.host.statistics.timestamp[].cpu-load-all.cpu[].usr,其中timestamp是30个元素的数组,而cpu是1-64元素的数组。如何干净地访问pymongo中深层嵌入的字段?

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,干净?我是否必须通过索引每个数组来访问每个字段,然后在每个数组字段上进行多次迭代?

回答

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. 

另外,汇总数据的服务器端,你可以使用$以$和$或者平均或一些其他分组操作与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'} 
    } 
}]))) 
+0

这是否存储服务器端的结果?或者我可以以某种方式访问​​查询的结果吗? – MrDuk

+0

当我用上面的示例填写“列表(...)”时,我得到一个返回的空列表。 – MrDuk

+1

PyMongo的聚合返回一个游标:http://api.mongodb.com/python/current/examples/aggregation.html要将结果存储在服务器上,请使用聚合管道运算符“$ out”:https://docs.mongodb .com/v3.2/reference/operator/aggregation/out/ –