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

Trouver des documents dont le champ tableau contient au moins n éléments d'un tableau donné

Supposons que nous ayons les documents suivants dans notre collection :

{ "_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 ] }

et le tableau d'entrée suivant et n = 2

var inputArray = [1, 3, 0];

Nous pouvons renvoyer les documents où le champ de tableau contient au moins n éléments d'un tableau donné en utilisant le cadre d'agrégation.

Le $match sélectionne uniquement les documents dont la longueur du tableau est supérieure ou égale à n . Cela réduit la quantité de données à traiter dans le pipeline.

Le $redact l'opérateur de pipeline utilise un traitement de condition logique en utilisant le $cond opérateur et les opérations spéciales $$KEEP pour "conserver" le document où la condition logique est vraie ou $$PRUNE pour "écarter" le document où la condition est fausse.

Dans notre cas, la condition est $gte qui retourne vrai si le $size de l'intersection des deux tableaux, que nous calculons en utilisant le $setIntersection l'opérateur est supérieur ou égal à 2 .

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

qui produit :

{ "_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 ] }