MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment filtrer un tableau de sous-documents ?

À partir de MongoDB 3.2, nous pouvons utiliser le $filter l'opérateur pour y parvenir efficacement. Dans $filter Nous devons utiliser l'expression conditionnelle de $setIsSubset opérateur pour vérifier si une valeur donnée est dans le tableau. C'est principalement parce que nous ne pouvons pas utiliser le $in opérateur de requête dans le $project scène.

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

À partir de MongoDB 3.0.x, vous avez besoin d'une approche différente et moins efficace en utilisant $map opérateur le et le $setDifference opérateur.

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