2014-12-03 97 views
2

我想我幾乎在那裏與我想做的事情,但我正在倒在最後的障礙。我需要從一個嵌套數組中提取多個值以及一個計數。MongoDB查詢返回一個數組中的多個值

我有很多的文件,看起來像這樣:

{ 
    "_id" : ObjectId("547db34cd9460c25e6000002"), 
    "doc_number" : "500715", 
    "error_list" : [ 
     { 
      "extractor" : "Code Check", 
      "message_number" : "RC9999", 
      "message" : "Code is not synchronised" 
     }, 
     { 
      "extractor" : "Metadata Check", 
      "message_number" : "RC1043", 
      "message" : "No metadata for document" 
     }, 
     { 
      "extractor" : "Property Extractor", 
      "message_number" : "PE1012", 
      "message" : "No properties found" 
     } 
    ] 
} 

我可以查詢集合來獲得與每個錯誤代碼的計數:

db.errors.aggregate( 
    [ 
    { $unwind : "$error_list" }, 
    { $group : 
     { _id : "$error_list.message_number", 
      count: { $sum : 1 } 
     } 
    } 
    ] 
); 

,並返回此:

{ 
    "result" : [ 
     { 
      "_id" : "PE1012", 
      "count" : 12 
     }, 
     { 
      "_id" : "RC1043", 
      "count" : 2 
     }, 
     { 
      "_id" : "RC9999", 
      "count" : 10 
     } 
    ], 
    "ok" : 1 
} 

我想添加到結果中的是消息文本。我無法解決如何做到這一點,所以任何幫助都會很棒。

我想結果看起來與此類似:

{ 
    "result" : [ 
     { 
      "_id" : "PE1012", 
      "count" : 12, 
      "message" : "No properties found" 

     }, 
     { 
      "_id" : "RC1043", 
      "count" : 2, 
      "message" : "No metadata for document" 
     }, 
     { 
      "_id" : "RC9999", 
      "count" : 10, 
      "message" : "Code is not synchronised" 
     } 
    ], 
    "ok" : 1 
} 

回答

2

你需要利用$first$last運營商,如果有相同的錯誤代碼中的所有記錄也將有同樣的錯誤信息。

db.errors.aggregate( 
    [ 
    { $unwind : "$error_list" }, 
    { $group : { "_id" : "$error_list.message_number", 
       "message":{$first:"$error_list.message"}, 
       "count": { $sum : 1 }} 
    } 
    ] 
); 

如果他們有可能有不同的錯誤信息,那麼你需要使用形成錯誤$addToSet消息數組。

db.errors.aggregate( 
    [ 
    { $unwind : "$error_list" }, 
    { $group : { "_id" : "$error_list.message_number", 
       "messages":{$addToSet:"$error_list.message"}, 
       "count": { $sum : 1 }} 
    } 
    ] 
); 
+0

對不起,我的答覆很慢。這正是我所追求的,謝謝你的出色解釋。 – spannerj 2014-12-12 10:23:49