Hãy nói chúng tôi có các tài liệu sau trong bộ sưu tập của chúng tôi:
{ "_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ả lại các tài liệu đó trong đó trường mảng chứa ít nhất n phần tử của một cho mảng 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 lượng dữ liệu được xử lý xuống trong đường ống.
Các nhà điều hành đường ống $redact
sử dụng một chế biến điều kiện logic bằng cách sử dụng $cond
điều hành và các hoạt động đặc biệt $$KEEP
để "giữ" các tài liệu nơi điều kiện logic là đúng hay $$PRUNE
để "loại bỏ" các tài liệu nơi điều kiện là sai.
Trong trường hợp của chúng tôi, tình trạng này là $gte
mà trả về true nếu $size
của giao nhau của hai mảng, mà chúng tôi tính toán sử dụng toán tử $setIntersection
là 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"
]
}}
]
)
trong đó 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 ] }
cấu trúc Hiện db và những gì yo đã cố gắng cho đến nay để làm cho nó làm việc. – Shrabanee
Tôi không nghĩ rằng câu hỏi là đủ rõ ràng rằng tôi không cần phải cung cấp cấu trúc db. Tôi không chắc liệu mongodb cung cấp một cuộc gọi API như vậy, vì vậy tôi chỉ nghĩ về việc lặp qua tất cả các tài liệu .... Tất nhiên, nó có vẻ thực sự xấu –
Các mục của 'myArray' và' wordsCollection' có độc đáo không? – Redu