Mongodb 按某些条件筛选数组的子数组
Hi拥有以下格式的文档:Mongodb 按某些条件筛选数组的子数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,Hi拥有以下格式的文档: { "_id":"someId", "someArray":[ { "subId":1, "subArray":[ { "field1":"A", "filterMe":"NO" }, { "field1":"B", "f
{
"_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"
}
]
}
]
}
如何根据某些条件过滤子阵列。示例:如果field filterMe为“是”,则过滤掉子阵列。最后,输出json应该是
{
"_id":"someId",
"someArray":[
{
"subId":1,
"subArray":[
{
"field1":"A",
"filterMe":"NO"
}
]
},
{
"subId":2,
"subArray":[
{
"field1":"D",
"filterMe":"NO"
}
]
}
]
}
我尝试了下面的方法,但它过滤了整个子阵列
db.testJson.aggregate([
{ $project: {
'someArray.subArray': {
$filter: {
input: '$someArray.subArray',
as: 'input',
cond: {$eq: ["$$input.filterMe", "YES"]}
}}
}}
]);
您只需要在a中插入一个:
db.junk.aggregate([
{“$project”:{
“someArray”:{
“$filter”:{
“输入”:{
“$map”:{
“输入”:“$someArray”,
“作为”:“一些”,
“在”:{
“subId”:“$$some.subId”,
“子阵列”:{
“$filter”:{
“输入”:“$$some.subArray”,
“as”:“sub”,
“cond”:{“$ne”:[“$$sub.filterMe”,“YES”]}
}
}
}
}
},
“作为”:“一些”,
“cond”:{“$gt”:[{“$size”:“$$some.subArray”},0]}
}
}
}}
])
产生:
{
“_id”:“someId”,
“someArray”:[
{
“subId”:1,
“子阵列”:[
{
“字段1”:“A”,
“过滤器”:“否”
}
]
},
{
“subId”:2,
“子阵列”:[
{
“字段1”:“D”,
“过滤器”:“否”
}
]
}
]
}
实际上,我将其包装在一个附加的文件中,以删除任何
someArray
条目,其中过滤后的子数组
结果为空。里程数可能因您想做的事情而异。看看这是否有帮助@Veeram这不是我们要问的问题here@NeilLunn引用的帖子有一个答案,没有额外的外部$filter
,答案与当前答案完全相同。我错过了什么?如何在条件下使用$exists而不是$ne?@SparkOn不知道你的意思。在你的问题中,你要么想要平等,要么想要不平等。$exists
的“逻辑”形式为,但此处不适用。要小心,因为如果你的真实数据看起来不像你问的问题,那么尝试应用不同的东西可能不会得到相同的结果。如果你有其他问题,那么你应该改为。这样就更清楚了。