通过某些条件过滤数组的子数组 [英] Filter the sub array of an array by some criteria
问题描述
您有一个格式为:
{
"_id":"someId",
"someArray":[
{
"subId":1,
"subArray":[
{
"field1":"A",
"filterMe":"NO"
},
{
"field1":"B",
"filterMe":"YES"
}
]
},
{
"subId":2,
"subArray":[
{
"field1":"C",
"filterMe":"YES"
},
{
"field1":"D",
"filterMe":"NO"
}
]
}
]
}
如何根据某些条件过滤subArray.示例,如果字段filterMe为"YES",则过滤出subArray.所以最后输出的json应该像
how can i filter the subArray based on some criteria. Example filter out the subArray if field filterMe is "YES". so finally the output json should be like
{
"_id":"someId",
"someArray":[
{
"subId":1,
"subArray":[
{
"field1":"A",
"filterMe":"NO"
}
]
},
{
"subId":2,
"subArray":[
{
"field1":"D",
"filterMe":"NO"
}
]
}
]
}
我以下面的方式尝试过,但是,它过滤了整个subArray.
I tried in the below way but, its filtering the whole subArray.
db.testJson.aggregate([
{ $project: {
'someArray.subArray': {
$filter: {
input: '$someArray.subArray',
as: 'input',
cond: {$eq: ["$$input.filterMe", "YES"]}
}}
}}
]);
推荐答案
您只需要在<内部添加 $filter
a href ="https://docs.mongodb.com/manual/reference/operator/aggregation/map/" rel ="nofollow noreferrer"> $map
:
You just need a $filter
inside a $map
:
db.junk.aggregate([
{ "$project": {
"someArray": {
"$filter": {
"input": {
"$map": {
"input": "$someArray",
"as": "some",
"in": {
"subId": "$$some.subId",
"subArray": {
"$filter": {
"input": "$$some.subArray",
"as": "sub",
"cond": { "$ne": [ "$$sub.filterMe", "YES" ] }
}
}
}
}
},
"as": "some",
"cond": { "$gt": [ { "$size": "$$some.subArray" }, 0 ] }
}
}
}}
])
产生:
{
"_id" : "someId",
"someArray" : [
{
"subId" : 1,
"subArray" : [
{
"field1" : "A",
"filterMe" : "NO"
}
]
},
{
"subId" : 2,
"subArray" : [
{
"field1" : "D",
"filterMe" : "NO"
}
]
}
]
}
我实际上将其包装在其他 $filter
中删除所有someArray
条目,这些条目的结果是过滤后的subArray
最终为空.里程可能会因您想做的而异.
I actually wrap that in an additional $filter
to remove any someArray
entries where the filtered subArray
ended up being empty as a result. Mileage may vary on that being what you want to do.
这篇关于通过某些条件过滤数组的子数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!