コレクションに次のドキュメントがあるとします。
{ "_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
であるドキュメントを「保持」する 条件がfalseのドキュメントを「破棄」します。
この場合、条件は$gte
です。 $size
の場合はtrueを返します $setIntersection
を使用して計算した2つの配列の交点の 演算子が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 ] }