sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo filtrar una matriz de subdocumentos?

A partir de MongoDB 3.2, podemos usar el $filter operador a eficientemente a esto. En $filter Para la expresión condicional, necesitamos usar el $setIsSubset operador para verificar si un valor dado está en la matriz. Esto se debe principalmente a que no podemos usar el $in operador de consulta en el $project escenario.

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

Desde MongoDB 3.0.x hacia atrás, necesita un enfoque diferente y menos eficiente utilizando $map operador el y el $setDifference operador.

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