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

Encuentre documentos cuyo campo de matriz contenga al menos n elementos de una matriz dada

Digamos que tenemos los siguientes documentos en nuestra colección:

{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d03"), "a" : [ 0, 8, 432, 9, 34, -3 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }

y la siguiente matriz de entrada y n = 2

var inputArray = [1, 3, 0];

Podemos devolver aquellos documentos en los que el campo de la matriz contiene al menos n elementos de una matriz determinada utilizando el marco de agregación.

El $match selecciona solo aquellos documentos con una longitud de matriz mayor o igual a n . Esto reduce la cantidad de datos que se procesarán en la canalización.

El $redact el operador de canalización usa un procesamiento de condición lógica usando $cond operador y las operaciones especiales $$KEEP para "mantener" el documento donde la condición lógica es verdadera o $$PRUNE para "descartar" el documento donde la condición es falsa.

En nuestro caso, la condición es $gte que devuelve verdadero si $size de la intersección de las dos matrices, que calculamos usando $setIntersection el operador es mayor o igual a 2 .

db.collection.aggregate(
    [ 
        { "$match": { "a.1": { "$exists": true } } }, 
        { "$redact": { 
            "$cond": [ 
                { "$gte": [ 
                    { "$size": { "$setIntersection": [ "$a", inputArray ] } }, 
                    2
                ]},
                "$$KEEP", 
                "$$PRUNE" 
            ]
        }}
    ]
)

que produce:

{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }