![](/img/trans.png)
[英]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.