2013-02-21 39 views
3

我的文件是這樣的:MongoDB聚合返回值作爲鍵的嵌套組?

{ 
     "_id" : "Tvq579754r", 
     "Status" : "passed", 
     "Title" : "up08c", 
     "ProjectID" : "Tvq5p", 
     "Version" : "1.0.0", 
     "Platform" : "platform_x", 
     "METRIC_A" : 11114.85, 
     "METRIC_B" : 68.9, 
     "METRIC_C" : 65.35, 
}, 
{ 
     "_id" : "Tvq579755r", 
     "Status" : "passed", 
     "Title" : "up09c", 
     "ProjectID" : "Tvq5p", 
     "Version" : "1.0.0", 
     "Platform" : "platform_x", 
     "METRIC_A" : 21114.85, 
     "METRIC_B" : 168.9, 
     "METRIC_C" : 165.35, 
}, 
{ 
     "_id" : "Tvq579756r", 
     "Status" : "passed", 
     "Title" : "up09c", 
     "ProjectID" : "Tvq5p", 
     "Version" : "1.0.0", 
     "Platform" : "platform_x", 
     "METRIC_A" : 31114.85, 
     "METRIC_B" : 268.9, 
     "METRIC_C" : 265.35, 
} 

現在我沒有問題,分組和由ProjectIDVersionPlatformTitle,但什麼分組讓我METRIC_領域的$avg$sum我想內完成聚合骨架(如果可能)是用於返回使用分組值作爲鍵,諸如對象:

{ 
     <Project ID> : { 
       <Version> : { 
         <Platform> : { 
           <Title> : { 
             "METRIC_A": <sum of METRIC_A>, 
             "METRIC_B": <sum of METRIC_B>, 
             "METRIC_C": <sum of METRIC_C>, 
           } 
         } 
       } 
     } 
} 

或者,在我的例子的情況下:

{ 
     'Tvq5p' : { 
       '1.0.0' : { 
         'platform_x' : { 
           'up08c' : { 
             "METRIC_A": 11114.85, 
             "METRIC_B": 68.9, 
             "METRIC_C": 65.35, 
           }, 
           'up09c' : { 
             "METRIC_A": 52229.7, 
             "METRIC_B": 437.8, 
             "METRIC_C": 430.7, 
           } 
         } 
       } 
     } 
} 

我目前做一次查詢結果由消費服務,這是不是非常慢或任何接收,但是我只是認爲這將是很好的來了,是這樣直接從Mongo開始。這甚至有可能嗎?

謝謝。

+0

有一個功能請求,以允許這發生在$項目階段,請投它! https://jira.mongodb.org/browse/SERVER-5947 – 2013-09-01 20:41:52

回答

0

在MongoDB中有group operation

db.records.group({ 
    key: { 'platform_x': 1, 'title': 1 }, 
    reduce: function(cur, result) { 
    result.metric_a += cur.metric_a; 
    result.metric_b += cur.metric_b; 
    result.metric_c += cur.metric_c; 
    }, 
    initial: { metric_a = 0, metric_b = 0, metric_c = 0 } 
}) 

如果這不起作用,我會建議Map Reduce