Você quase respondeu isso em suas tags. MongoDB tem um
$regex
operador que permite que uma expressão regular seja submetida como uma consulta. Então você consulta por strings contendo "Alex", você faz isso:Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Você também pode fazer isso:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Ambos são válidos e diferentes de como você tentou na sintaxe correta com suporte, conforme mostrado na documentação.
Mas é claro que se você está realmente perguntando "como obter os resultados de 'array' apenas para aqueles que correspondem a 'Alex' em algum lugar da string?" então isso é um pouco diferente.
Correspondência complexa para mais de um elemento array é o domínio do framework de agregação (ou possivelmente mapReduce, mas isso é muito mais lento), onde você precisa "filtrar" o conteúdo do array.
Você começa do mesmo jeito. A chave aqui é
$unwind
para "desnormalizar" o conteúdo da matriz para poder "filtrar" adequadamente como documentos individuais. Em seguida, reconstrua a matriz com os documentos "correspondentes". 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) {
}
)