2017-01-09 2 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 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'} 
    } 
}]))) 
+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/ –