Filter the sub array of an array by some criteria

后端 未结 1 894
予麋鹿
予麋鹿 2020-12-20 06:24

Hi have a document in the format :

{
   \"_id\":\"someId\",
   \"someArray\":[
      {
         \"subId\":1,
         \"subArray\":[
            {
                   


        
相关标签:
1条回答
  • 2020-12-20 06:42

    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 ] }
          }
        }
      }}
    ])
    

    Produces:

    {
            "_id" : "someId",
            "someArray" : [
                    {
                            "subId" : 1,
                            "subArray" : [
                                    {
                                            "field1" : "A",
                                            "filterMe" : "NO"
                                    }
                            ]
                    },
                    {
                            "subId" : 2,
                            "subArray" : [
                                    {
                                            "field1" : "D",
                                            "filterMe" : "NO"
                                    }
                            ]
                    }
            ]
    }
    

    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.

    0 讨论(0)
提交回复
热议问题