Lad os sige, at vi har følgende dokumenter i vores 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 ] }
og følgende input-array og n = 2
var inputArray = [1, 3, 0];
Vi kan returnere de dokumenter, hvor matrixfeltet indeholder mindst n elementer af en given matrix ved hjælp af aggregeringsrammen.
$match
vælger kun de dokumenter med arrayets længde større eller lig med n
. Dette reducerer mængden af data, der skal behandles nede i pipelinen.
$redact
pipeline operatør bruger en logisk tilstandsbehandling ved hjælp af $cond
operatør og de særlige operationer $$KEEP
at "beholde" dokumentet, hvor den logiske betingelse er sand eller $$PRUNE
at "kassere" dokumentet, hvor betingelsen er falsk.
I vores tilfælde er betingelsen $gte
som returnerer sand hvis $size
af skæringspunktet mellem de to arrays, som vi beregner ved hjælp af $setIntersection
operatoren er større end eller lig med 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
som producerer:
{ "_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 ] }