2016-02-05 157 views
0

我的MongoDB中2.6.11文檔集合的mongodb的合計平均,其中「CPU」是表示陣列[CPU0,CPU1],參見下文數組元素

{ cpu: [ '100','20' ], hostname: 'host1',_id: 1 }, 
{ cpu: [ '40','30' ], hostname: 'host1',_id: 2 }, etc 

例如我想找平均CPU上('70','25'](因爲'100'+'40'/ 2 = '70'和'20'+'30'='25')的'host1'。我想對於CPU1聚集,但它不給我正確的結果

db.collection.aggregate(
    [ 
     { 
      $group: 
      { 
       _id:"hostname", 
       avgCPU: {$avg: "$cpu.1"} 
      } 
     } 
    ] 
); 

回答

1

在MongoDB中聚集2.6位置符號是不支持的,你需要$unwind您的文檔,並在下一階段進行$avg

在MondoDB 3.2然而,你有$ arrayElemAt運營商,其在基於您發佈的文檔結構指定索引{ $arrayElemAt: [ <array>, <idx> ] }

返回元素,這個查詢會做的工作:

db.cpu.aggregate([ 
{$unwind: "$cpu"}, 
{$group: { 
    _id: "$_id", 
    first: {$first: "$cpu"}, 
    last: {$last: "$cpu"} 
}}, 
{$group: { 
    _id: 0, 
    firstAvg: {$avg: "$first"}, 
    lastAvg: {$avg: "$last"} 
}} 
]); 
+0

抱歉, _id是不同的,我只是想簡化 – irom

+0

所以像下面? db.collection.aggregate( [{ $放鬆:{ 路徑: 「$ CPU」, includeArrayIndex: 「VS」 } }, {$匹配:{ 「VS」:{ 「$當量」:1 }}},{ $ 組:{ _id: 「主機名」, avgCPU:{$平均: 「$ CPU」}} } ] ); – irom

+0

我已經更新我的答案,並且會得到您需要的結果 – Orejano