sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan filtrerer man række af underdokumenter?

Fra MongoDB 3.2 kan vi bruge $filter operatør til effektivt at gøre dette. I $filter s betingede udtryk skal vi bruge $setIsSubset operatør for at kontrollere, om en given værdi er i arrayet. Dette skyldes primært, at vi ikke kan bruge $in forespørgselsoperator i $projekt scene.

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

Fra MongoDB 3.0.x og baglæns har du brug for en anden, mindre effektiv tilgang ved at bruge $map operatoren og $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. Har MongoDBs $in-klausul nogen maks. grænse i antal argumenter

  2. Lagring af indlejrede javascript-objekter i redis - NodeJS

  3. Meteor Mongo findOne returnerer udefineret i metode

  4. Mongoose time out og kaster undtagelse