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

Mongodb 如何干净地访问pymongo中的深埋字段?,mongodb,pymongo,Mongodb,Pymongo,我的文档以sysstat.host.statistics.timestamp[].cpu load all.cpu[].usr格式存储,其中timestamp是一个30元素数组,cpu是一个1-64元素数组 如果我抓取时间戳字段 timestampCursor = HOST_USAGE.find( {'sysstat.host.nodename': host}, {'sysstat.host.statistics.timestamp': 1}) 然后如何才能干净地访问sysst

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

如果我抓取
时间戳
字段

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

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

是的,您必须通过索引每个数组来访问每个字段,并在每个数组字段上进行多次迭代

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.
或者,要聚合数据服务器端,可以使用$sum或$average的$unwind或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'}
    }
}])))

这是否也将结果存储在服务器端?或者我可以以某种方式访问查询结果吗?当我填写上面的示例时,
打印列表(…)
返回一个空列表。PyMongo的聚合返回一个光标:要在服务器上存储结果,请使用聚合管道操作符“$out”:谢谢!我如何修改你的例子,只考虑<代码> CPU加载所有。CPU(0)。也就是说,如果我只想从第一个
cpu[]
字段得到
usr
的值?