MongoDB查询从数组中返回多个值

时间:2014-12-03 13:18:45

标签: mongodb-query

我想我几乎就在那里,我想做什么,但我在最后一道障碍。我需要从嵌套数组中提取多个值以及计数。

我有很多文档如下:

{
    "_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
}

1 个答案:

答案 0 :(得分: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 }}
     }
  ] 
);