假设我们收集了以下文档:
{ "_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 个元素的文档。
The $match https://docs.mongodb.com/manual/reference/operator/aggregation/match/仅选择数组长度大于或等于的文档n
。这减少了管道中要处理的数据量。
The $redact https://docs.mongodb.com/manual/reference/operator/aggregation/redact/管道运算符使用逻辑条件处理使用$cond https://docs.mongodb.com/manual/reference/operator/aggregation/cond/操作员和特殊操作$$KEEP https://docs.mongodb.com/manual/reference/operator/aggregation/redact/#keep“保留”逻辑条件为真的文档或$$PRUNE https://docs.mongodb.com/manual/reference/operator/aggregation/redact/#prune“丢弃”条件为假的文档。
在我们的例子中,条件是$gte https://docs.mongodb.com/manual/reference/operator/aggregation/gte/如果$size https://docs.mongodb.com/manual/reference/operator/aggregation/size/两个数组的交集,我们使用以下方法计算$setIntersection https://docs.mongodb.com/manual/reference/operator/aggregation/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 ] }