sql >> Database >  >> NoSQL >> MongoDB

Hoe een reeks subdocumenten filteren?

Vanaf MongoDB 3.2 kunnen we de $filter operator om hier efficiënt op in te spelen. In $filter 's voorwaardelijke expressie moeten we de $setIsSubset operator om te controleren of een bepaalde waarde in de array staat. Dit komt voornamelijk omdat we de $in query-operator in de $project podium.

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

Vanaf MongoDB 3.0.x heb je een andere, minder efficiënte aanpak nodig met de $map operator de en de $setDifference exploitant.

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


  1. Verander het type veld binnen mongoDB-aggregatie en gebruikt $lookup index op velden of niet?

  2. Waarom hebben we een 'arbiter' nodig in MongoDB-replicatie?

  3. Fast of Bulk Upsert in pymongo

  4. mongoDB voegt specifieke gegevens toe aan db Replica