按某些条件过滤数组的子数组 [英] Filter the sub array of an array by some criteria
本文介绍了按某些条件过滤数组的子数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
你好,有一个格式如下的文档:
Hi have a document in the format :
{
"_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"]}
}}
}}
]);
推荐答案
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屋!
查看全文