簡體   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