sql >> Database >  >> NoSQL >> MongoDB

Filter de subarray van een array op enkele criteria

Je hebt alleen een $filter nodig in een $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 ] }
      }
    }
  }}
])

Produceert:

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

Ik stop dat eigenlijk in een extra $filter om een ​​someArray . te verwijderen vermeldingen waar de gefilterde subArray stond daardoor leeg. Het aantal kilometers kan variëren, afhankelijk van wat u wilt doen.




  1. MongoDB $mergeObjects

  2. Redis:Race Conditie en Single threaded

  3. MongoDB $strLenBytes

  4. MongoDB oplog wijzigen en opnieuw afspelen