MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Finden Sie Dokumente, deren Array-Feld mindestens n Elemente eines gegebenen Arrays enthält

Nehmen wir an, wir haben die folgenden Dokumente in unserer Sammlung:

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

und das folgende Eingabearray und n = 2

var inputArray = [1, 3, 0];

Wir können die Dokumente zurückgeben, bei denen das Array-Feld mindestens n Elemente eines gegebenen Arrays enthält, indem wir das Aggregations-Framework verwenden.

Das $match wählt nur die Dokumente aus, deren Länge größer oder gleich n ist . Dies reduziert die zu verarbeitende Datenmenge in der Pipeline.

Der $redact Pipeline-Operatoren verwenden eine logische Bedingungsverarbeitung mit $cond -Operator und die speziellen Operationen $$KEEP um das Dokument zu "behalten", wo die logische Bedingung wahr ist oder $$PRUNE um das Dokument zu "verwerfen", wenn die Bedingung falsch ist.

In unserem Fall ist die Bedingung $gte was true zurückgibt, wenn $size der Schnittmenge der beiden Arrays, die wir mit $setIntersection berechnen Operator ist größer oder gleich 2 .

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

was produziert:

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