我的文档以sysstat.host.statistics.timestamp[].cpu-load-all.cpu[].usr
格式存储,其中timestamp
是30个元素数组,cpu
是1-64个元素数组。
如果我抓住timestamp
字段,
timestampCursor = HOST_USAGE.find(
{'sysstat.host.nodename': host},
{'sysstat.host.statistics.timestamp': 1})
如何干净利落地访问sysstat.host.statistics.timestamp[*].cpu-load-all.cpu[0].usr
?我是否必须通过索引每个数组来访问每个字段,因此在每个数组字段上进行多次迭代?
答案 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'}
}
}])))