Mis documentos se almacenan en el formato sysstat.host.statistics.timestamp[].cpu-load-all.cpu[].usr
, donde timestamp
es una matriz de 30 elementos y cpu
es una matriz de 1 a 64 elementos.
Si tomo el campo de timestamp
de tiempo,
timestampCursor = HOST_USAGE.find( {'sysstat.host.nodename': host}, {'sysstat.host.statistics.timestamp': 1})
¿Cómo puedo acceder a sysstat.host.statistics.timestamp[*].cpu-load-all.cpu[0].usr
de forma limpia? ¿Tengo que acceder a cada campo indexando cada matriz y, por lo tanto, varias iteraciones sobre cada campo de matriz?
Sí, debe acceder a cada campo indexando cada matriz y, por lo tanto, múltiples iteraciones sobre cada campo de matriz.
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.
Como alternativa, para agregar los datos del lado del servidor, puede usar $unwind con $sum o $average o alguna otra operación de agrupación con MongoDB Aggregation Framework.
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'} } }])))