2014-12-03 52 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