Mongodb 按某些条件筛选数组的子数组

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

Hi拥有以下格式的文档:

{
   "_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
的“逻辑”形式为,但此处不适用。要小心,因为如果你的真实数据看起来不像你问的问题,那么尝试应用不同的东西可能不会得到相同的结果。如果你有其他问题,那么你应该改为。这样就更清楚了。