MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Trova i documenti il ​​cui campo array contiene almeno n elementi di un dato array

Diciamo che abbiamo i seguenti documenti nella nostra collezione:

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

e il seguente array di input e n = 2

var inputArray = [1, 3, 0];

Possiamo restituire quei documenti in cui il campo dell'array contiene almeno n elementi di un dato array usando il framework di aggregazione.

Il $match seleziona solo quei documenti con la lunghezza dell'array maggiore o uguale a n . Ciò riduce la quantità di dati da elaborare nella pipeline.

Il $redact l'operatore della pipeline utilizza un'elaborazione della condizione logica utilizzando $cond operatore e le operazioni speciali $$KEEP per "conservare" il documento in cui la condizione logica è vera o $$PRUNE di "scartare" il documento in cui la condizione è falsa.

Nel nostro caso, la condizione è $gte che restituisce true se $size dell'intersezione dei due array, che calcoliamo utilizzando il $setIntersection operatore è maggiore o uguale a 2 .

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

che 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 ] }