我想我几乎就在那里,我想做什么,但我在最后一道障碍。我需要从嵌套数组中提取多个值以及计数。
我有很多文档如下:
{
"_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
}
答案 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 }}
}
]
);