Да кажем, че имаме следните документи в нашата колекция:
{ "_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 ] }
и следния входен масив и n = 2
var inputArray = [1, 3, 0];
Можем да върнем онези документи, в които полето на масива съдържа поне n елемента от даден масив, използвайки рамката за агрегиране.
$match
избира само онези документи с дължина на масива, по-голяма или равна на n
. Това намалява количеството данни, които трябва да се обработват надолу в конвейера.
$redact
операторът на конвейера използва обработка на логическо условие, използвайки $cond
оператор и специалните операции $$KEEP
за да "запазите" документа, където логическото условие е вярно или $$PRUNE
за да "отхвърлите" документа, където условието е фалшиво.
В нашия случай условието е $gte
което връща true, ако $size
на пресечната точка на двата масива, които изчисляваме с помощта на $setIntersection
операторът е по-голям или равен 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
което произвежда:
{ "_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 ] }