通过某些条件过滤数组的子数组 [英] Filter the sub array of an array by some criteria

查看:44
本文介绍了通过某些条件过滤数组的子数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您有一个格式为:

{
   "_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆