Ответ 1
Ты почти ответил на это сам в своих тегах. У MongoDB есть оператор $regex
, который позволяет отправлять регулярное выражение в виде запроса. Поэтому вы запрашиваете строки, содержащие "Alex", вы делаете это:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Вы также можете сделать это:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Оба действительны и отличаются от того, как вы пытались в правильном поддерживаемом синтаксисе, как показано в документации.
Но, конечно, если вы действительно спрашиваете "как получить результаты" массива "только для тех, которые соответствуют" Alex "где-то в строке?" то это немного другое.
Сложное сопоставление для элемента массива один является доменом структуры агрегации (или, возможно, 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) {
}
)