从MongoDB中的子文档数组中查找/获取子数组

时间:2018-03-21 16:09:51

标签: arrays mongodb aggregation-framework

我在集合中有以下格式的文档:

{"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。

2 个答案:

答案 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)

在汇总管道中,匹配hourNo0的所有文档。

然后将errorSegments数组展开到单个文档中。

查询errorSegments.errorCode405的文档的结果文档。

最后,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" }