Låt säga att vi har följande dokument i vår samling:
{ "_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 ] }
och följande inmatningsmatris och n = 2
var inputArray = [1, 3, 0];
Vi kan returnera de dokument där arrayfältet innehåller minst n element av en given array med hjälp av aggregeringsramverket.
$match
väljer bara de dokument med arrayens längd större eller lika med n
. Detta minskar mängden data som ska bearbetas nere i pipelinen.
$redact
pipeline-operatören använder en logisk villkorsbearbetning med $cond
operatorn och specialoperationerna $$KEEP
att "behålla" dokumentet där det logiska villkoret är sant eller $$PRUNE
för att "kassera" dokumentet där villkoret är falskt.
I vårt fall är villkoret $gte
som returnerar sant om $size
av skärningspunkten mellan de två arrayerna, som vi beräknar med hjälp av $setIntersection
operatorn är större än eller lika med 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
som producerar:
{ "_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 ] }