Bạn gần như đã tự trả lời câu hỏi này trong thẻ của mình. MongoDB có $regex
toán tử cho phép một biểu thức chính quy được gửi dưới dạng truy vấn. Vì vậy, bạn truy vấn các chuỗi có chứa "Alex", bạn thực hiện như sau:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Bạn cũng có thể làm điều này:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Cả hai đều hợp lệ và khác với cách bạn đã thử theo đúng cú pháp được hỗ trợ như được hiển thị trong tài liệu.
Nhưng tất nhiên nếu bạn thực sự hỏi "làm thế nào để chỉ nhận được kết quả 'mảng' cho những kết quả khớp với 'Alex' ở đâu đó trong chuỗi?" thì điều này hơi khác một chút.
Đối sánh phức tạp cho nhiều hơn một phần tử mảng là miền của khung tổng hợp (hoặc có thể là mapReduce, nhưng tốc độ đó chậm hơn nhiều), nơi bạn cần "lọc" nội dung mảng.
Bạn bắt đầu giống nhau. Chìa khóa ở đây là $unwind
để "khử chuẩn hóa" nội dung mảng để có thể "lọc" đúng như các tài liệu riêng lẻ. Sau đó, xây dựng lại mảng với các tài liệu "khớp".
Books.aggregate(
[
// Match first to reduce documents to those where the array contains the match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},
// Unwind to "de-normalize" the document per array element
{ "$unwind": "$authors" },
// Now filter those document for the elements that match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},
// Group back as an array with only the matching elements
{ "$group": {
"_id": "$_id",
"title": { "$first": "$title" },
"authors": { "$push": "$authors" },
"subjects": { "$first": "$subjects" }
}}
],
function(err,results) {
}
)