繁体   English   中英

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

[英]find/get sub-array from an array of sub-document in MongoDB

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

{"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,因为还会有其他文档使用不同的小时数。

所需的最终输出是具有与某些errorCode的条件匹配的“ errorSegmentId”,“ errorCode”的子文档的子数组。

例如 :

获取1小时内具有errorCode 405的所有errorSegments。

因此输出将是:

{
 "errorSegmentId" : "1011",
 "errorCode" : "405"
},
{
 "errorSegmentId" : "1055",
 "errorCode" : "405"
},

{
 "errorSegmentId" : "1033",
 "errorCode" : "405"
}

================================================== ===========

我已经尝试了一些聚合操作,但是无法获得预期的结果。

TIA。

您可以在3.4中使用以下汇总。

$match仅过滤存在errorSegments数组且至少有一个errorCode与输入错误代码匹配的文档。

$filter the 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"}}
])

在聚合管道中,匹配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" }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM