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

私はその後、きれいに、sysstat.host.statistics.timestamp[*].cpu-load-all.cpu[0].usrにアクセスするにはどうすればよいtimestampフィールド、

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

をつかみますか?各アレイにインデックスを付けて各フィールドにアクセスする必要があるので、各アレイフィールド上で複数の繰り返しを行う必要がありますか?

答えて

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の集計フレームワークと他のいくつかのグループ化操作を片手にくつろぐことができます。

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/ –

関連する問題