2017-01-09 14 views
0

で$グループアグリゲータと追加のフィールドを投写私は次のクエリを持っている:pymongo

HOST_USAGE.aggregate([{ 
    '$match': {'sysstat.host.nodename': host} 
    }, { 
     '$project': {'ts': '$sysstat.host.statistics.timestamp'} 
    }, { 
     '$unwind': '$ts' 
    }, { 
     '$unwind': '$ts.cpu-load-all.cpu' 
    }, { 
     '$group': { 
      '_id': 0, 
      'all-usr': {'$max': '$ts.cpu-load-all.cpu.usr'} 
     } 
    }]) 

はしかし、私がつかむしたい追加のフィールドがあります、$sysstat.host.statistics.timestamp[*].time

enter image description here

私は」ちょうど試しました、

'$group': { 
    '_id': 0, 
    'all-usr': {'$max': '$ts.cpu-load-all.cpu.usr'}, 
    'time': '$ts.time' 
} 

しかし、このgiエラー:pymongo.errors.OperationFailure: exception: the group aggregate field 'time' must be defined as an expression inside an object。どのようにすれば$groupいくつかのフィールドを作成し、返されたデータセットに他のフィールドを投影することはできますか?

答えて

1

フィールドをグループ化する場合は、すべてのフィールドをグループ化する必要があります。あなたは、タイムスタンプの配列を取得するために$プッシュまたは$ addToSetを使用することができます。

HOST_USEAGE.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'}, 
     'times': {'$addToSet': '$ts.time'} 
    } 
}]))) 

私は、出力配列内の重複時間を避けるために$addToSetをお勧めします:$pushあなたは、CPU負荷のすべて」ごとに毎回の一つのコピーを与えるだろう"エントリーは$ unwindがどのように動作するかのためにエントリします。

+0

ありがとうございましたが、実際には '$ max'が見つかった別の時刻を取得しています。それはここで可能ですか、または私は完全に私のクエリを再構築する必要がありますか? – MrDuk