我在集合中有以下格式的文档:
{"hourNo":"0","errorSegments":[
{
"errorSegmentId" : "1019",
"errorCode" : "401"
},
{
"errorSegmentId" : "1022",
"errorCode" : "402"
},
{
"errorSegmentId" : "1010",
"errorCode" : "405"
}
]}
{"hourNo":"1","errorSegments":[
{
"errorSegmentId" : "1011",
"errorCode" : "405"
},
{
"errorSegmentId" : "1055",
"errorCode" : "405"
},
{
"errorSegmentId" : "1033",
"errorCode" : "405"
},
{
"errorSegmentId" : "1042",
"errorCode" : "408"
}
]}
要匹配的第一个标准是hourNo,因为会有其他具有不同小时数的文档。
所需的最终输出是具有“errorSegmentId”的子文档的子数组,“errorCode”与某些errorCode的条件匹配。
例如:
获取小时1中包含errorCode 405的所有errorSegments。
所以输出结果为:
{
"errorSegmentId" : "1011",
"errorCode" : "405"
},
{
"errorSegmentId" : "1055",
"errorCode" : "405"
},
{
"errorSegmentId" : "1033",
"errorCode" : "405"
}
=============================================== ==============
我尝试了很少的聚合操作,但我不是 能够得到理想的结果。
TIA。
答案 0 :(得分:1)
您可以在3.4中使用以下聚合。
$match
仅过滤存在errorSegments数组的文档,其中至少有一个errorCode匹配输入错误代码。
$filter
errorSegments仅包含来自输入错误代码的errorSegment匹配,后跟$unwind
和$replaceRoot
以将匹配值提升到顶部。
db.col.aggregate([
{"$match":{"hourNo":"1","errorSegments.errorCode":"405"}},
{"$project":{
"errorSegments":{
"$filter":{
"input":"$errorSegments",
"as":"e",
"cond":{"$eq":["$$e.errorCode","405"]}
}
}
}},
{"$unwind":"$errorSegments"},
{"$replaceRoot": {"newRoot":"$errorSegments"}}
])
答案 1 :(得分:0)
在汇总管道中,匹配hourNo
为0
的所有文档。
然后将errorSegments
数组展开到单个文档中。
查询errorSegments.errorCode
为405
的文档的结果文档。
最后,replaceRoot
。
db.test.aggregate([
{$match: {"hourNo": "0"}},
{$unwind: "$errorSegments"},
{$match: {"errorSegments.errorCode": "405"}},
{$replaceRoot: {newRoot: "$errorSegments"}}
])
示例查询结果:
{ "errorSegmentId" : "1011", "errorCode" : "405" }
{ "errorSegmentId" : "1055", "errorCode" : "405" }
{ "errorSegmentId" : "1033", "errorCode" : "405" }