Почти сам си отговорил на това в своите тагове. MongoDB има $regex
оператор, който позволява регулярен израз да бъде подаден като заявка. Така че, ако търсите низове, съдържащи "Alex", правите това:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Можете също да направите това:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
И двете са валидни и различни от начина, по който сте опитали в правилния поддържан синтаксис, както е показано в документацията.
Но разбира се, ако всъщност питате „как да получите резултатите от „масив“ само за тези, които съвпадат с „Алекс“ някъде в низа?“ тогава това е малко по-различно.
Сложно съвпадение за повече отедно Елементът на масива е домейнът на рамката за агрегиране (или вероятно mapReduce, но това е много по-бавно), където трябва да „филтрирате“ съдържанието на масива.
Започвате почти същото. Ключът тук е да $unwind
да "денормализира" съдържанието на масива, за да може да "филтрира" правилно като отделни документи. След това повторно конструирайте масива със "съвпадащите" документи.
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) {
}
)