2017-03-03 85 views
0

我有以下結構文件:MongoDB中彙總了整個系列的嵌套值與計數

{ 
    _id: 123, 
    machine_id: 456, 
    data: { 
     some_data: 100, 
     exceptions: [{ 
      hash: 789, 
      value: 'something', 
      stack_trace: 'line 123: oops', 
      count: 5, 
     }] 
    } 
} 

{ 
    _id: 234, 
    machine_id: 567, 
    data: { 
     some_other_data: 200, 
     exceptions: [{ 
      hash: 789, 
      value: 'something', 
      stack_trace: 'line 123: oops', 
      count: 1, 
     }, { 
      hash: 890, 
      value: 'something_else', 
      stack_trace: 'line 678: ouch', 
      count: 3, 
     }] 
    } 
} 

的散列值和stack_trace的組合(我加了這個專門嘗試在整個聚集例外採集)。我想運行一個查詢,它返回每個不同的異常,以及總數,值和堆棧跟蹤。在這種情況下,結果將類似於:

[{ 
    hash: 789, 
    value: 'something', 
    stack_trace: 'line123: oops', 
    count: 6, 
}, { 
    hash: 890, 
    value: 'something_else', 
    stack_trace: 'line 678: ouch', 
    count: 3, 
}] 

我是很新的MongoDB,並sturggling得到聚合級流水給我任何有意義的輸出。

如果您認爲有更好的方法,也歡迎對構建這些數據的意見。

回答

2

你的結構看起來不錯。如果需要,可以刪除散列,並使用valuestack_trace作爲分組鍵。

您可以使用下面的聚合。

對於$group ING在hash,你將需要$unwindexceptions嵌入式陣列之後$first保持valuestack_trace$sum數沒有明顯異常。

db.collection.aggregate(
{$unwind:"$data.exceptions"}, 
{$group:{_id:"$data.exceptions.hash", value:{$first:"$data.exceptions.value"}, stack_trace:{$first:"$data.exceptions.stack_trace"}, count:{$sum:"$data.exceptions.count"}}}) 
+0

謝謝!這是我失蹤的最初'放鬆'! – Ferguzz

+0

看起來你看起來不錯,我可以問你快速計算集合中所有異常總數的最有效方法嗎?我是否也應該使用聚合?例如: collection.aggregate {'$ unwind':'$ data.exceptions'}, {'$ group':{ '_id':None, 'count':{'$ sum': '$ data.exceptions.count'} }}, ]) – Ferguzz

+0

這似乎是對的,或者你可以做'db.collection.distinct(「data.exceptions.count」)''會給你'[5,1, 3]',你可以用你的語言申請總和。例如,在JS中,你可以做'sum = [5,1,3] .reduce((a,b)=> a + b,0);' – Veeram