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
的值?