Giả sử chúng tôi có các tài liệu sau trong bộ sưu tập của mình:
{ "_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 ] }
và mảng đầu vào sau và n = 2
var inputArray = [1, 3, 0];
Chúng tôi có thể trả về những tài liệu mà trường mảng chứa ít nhất n phần tử của một mảng nhất định bằng cách sử dụng khung tổng hợp.
$match
chỉ chọn những tài liệu có độ dài của mảng lớn hơn hoặc bằng n
. Điều này làm giảm số lượng dữ liệu được xử lý trong đường dẫn.
$redact
nhà điều hành đường ống sử dụng một xử lý điều kiện logic bằng cách sử dụng $cond
toán tử và các phép toán đặc biệt $$KEEP
để "giữ" tài liệu ở đó điều kiện logic là đúng hoặc $$PRUNE
để "loại bỏ" tài liệu có điều kiện sai.
Trong trường hợp của chúng tôi, điều kiện là $gte
trả về true nếu $size
giao điểm của hai mảng, chúng tôi tính toán bằng cách sử dụng $setIntersection
toán tử lớn hơn hoặc bằng 2
.
db.collection.aggregate(
[
{ "$match": { "a.1": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$gte": [
{ "$size": { "$setIntersection": [ "$a", inputArray ] } },
2
]},
"$$KEEP",
"$$PRUNE"
]
}}
]
)
nơi sản xuất:
{ "_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 ] }