Řekněme, že máme ve sbírce následující dokumenty:
{ "_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 ] }
a následující vstupní pole a n = 2
var inputArray = [1, 3, 0];
Můžeme vrátit ty dokumenty, kde pole pole obsahuje alespoň n prvků daného pole pomocí agregačního rámce.
$match
vybere pouze dokumenty s délkou pole větší nebo rovnou n
. Tím se sníží množství dat, která mají být zpracována v procesu.
$redact
Operátor potrubí používá zpracování logické podmínky pomocí $cond
operátor a speciální operace $$KEEP
"uchovat" dokument, kde je logická podmínka pravdivá nebo $$PRUNE
"zahodit" dokument, kde je podmínka nepravdivá.
V našem případě je podmínkou $gte
což vrátí hodnotu true, pokud je $size
průniku dvou polí, který vypočítáme pomocí $setIntersection
operátor je větší nebo roven 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
který produkuje:
{ "_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 ] }