Katakanlah kita memiliki dokumen berikut dalam koleksi kita:
{ "_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 ] }
dan array input berikut dan n = 2
var inputArray = [1, 3, 0];
Kita dapat mengembalikan dokumen-dokumen di mana bidang array berisi setidaknya n elemen dari array yang diberikan menggunakan kerangka kerja agregasi.
$match
hanya memilih dokumen-dokumen dengan panjang larik lebih besar atau sama dengan n
. Hal ini mengurangi jumlah data yang akan diproses di dalam pipeline.
$redact
operator pipa menggunakan pemrosesan kondisi logis menggunakan $cond
operator dan operasi khusus $$KEEP
untuk "menyimpan" dokumen dengan kondisi logika benar atau $$PRUNE
untuk "membuang" dokumen yang kondisinya salah.
Dalam kasus kami, kondisinya adalah $gte
yang mengembalikan true jika $size
dari perpotongan dua larik, yang kami hitung menggunakan $setIntersection
operator lebih besar dari atau sama dengan 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
yang menghasilkan:
{ "_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 ] }