[英]Using MongoDB, how do I update a sub-document of a sub-array when element position is unknown?
[英]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"}}
])
在聚合管道中,匹配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" }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.