sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur filtrerar man en rad underdokument?

Från och med MongoDB 3.2 kan vi använda $filter operatören att effektivt göra detta. I $filter s villkorliga uttryck måste vi använda $setIsSubset operatorn för att kontrollera om ett givet värde finns i arrayen. Det beror främst på att vi inte kan använda $in frågeoperator i $project skede.

db.collection.aggregate([
    { "$project": { 
        "list": { 
            "$filter": { 
                "input": "$list", 
                "as": "lst", 
                "cond": { "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] }
            } 
        } 
    }}
])

Från MongoDB 3.0.x och bakåt behöver du ett annat, mindre effektivt tillvägagångssätt med $map operatorn och $setDifference operatör.

db.collection.aggregate([
    { "$project": { 
        "list": { 
            "$setDifference": [ 
                { "$map": { 
                    "input": "$list", 
                    "as": "lst", 
                    "in": { 
                        "$cond": [
                            { "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] },
                            "$$lst",
                            false
                        ] 
                    } 
                }}, 
                [false] 
            ]
        }
    }}
])


  1. Slå samman dokument med dess kapslade matriser och deras kapslade matriser

  2. docker mongo för enkel (endast primär nod) replikuppsättning (för utveckling)?

  3. Användarhantering i node js med express, mongodb som serverdatabas

  4. PooledRedisClientManager släpper inte anslutningar