sql >> Databasteknik >  >> NoSQL >> MongoDB

Filtrera undermatrisen för en matris efter vissa kriterier

Du behöver bara ett $filter inuti en $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 ] }
      }
    }
  }}
])

Producerar:

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

Jag lägger faktiskt in det i ytterligare ett $filter för att ta bort någon someArray poster där den filtrerade subArray som ett resultat av det blev tomt. Körsträckan kan variera beroende på vad du vill göra.




  1. Enkel användning av EM::Synchrony#sync orsakar "rotfiber" FiberError -- mitt fel?

  2. Redis Sentinel

  3. MongoDB:Använder matchning med indatadokumentvariabler

  4. Sammanfoga strängvärden i array i ett enda fält i MongoDB