Laten we zeggen dat we de volgende documenten in onze collectie hebben:
{ "_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 ] }
en de volgende invoerarray en n = 2
var inputArray = [1, 3, 0];
We kunnen die documenten retourneren waarin het arrayveld ten minste n elementen van een bepaalde array bevat met behulp van het aggregatieraamwerk.
De $match
selecteert alleen die documenten waarvan de lengte groter of gelijk is aan n
. Dit vermindert de hoeveelheid gegevens die in de pijplijn moet worden verwerkt.
De $redact
pijplijnoperator gebruikt een logische verwerking van voorwaarden met behulp van de $cond
operator en de speciale bewerkingen $$KEEP
om het document te "bewaren" waar de logische voorwaarde waar is of $$PRUNE
om het document te "weggooien" waar de voorwaarde onwaar is.
In ons geval is de voorwaarde $gte
die true retourneert als de $size
van de kruising van de twee arrays, die we berekenen met behulp van de $setIntersection
operator is groter dan of gelijk aan 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
die produceert:
{ "_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 ] }