Vous avez presque répondu à cela vous-même dans vos tags. MongoDB a un $regex
opérateur qui permet de soumettre une expression régulière en tant que requête. Donc, vous recherchez des chaînes contenant "Alex", vous faites ceci :
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Vous pouvez également faire ceci :
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Les deux sont valides et différents de la façon dont vous avez essayé dans la syntaxe prise en charge correcte, comme indiqué dans la documentation.
Mais bien sûr, si vous demandez réellement "comment obtenir les résultats 'tableau' uniquement pour ceux qui correspondent à 'Alex' quelque part dans la chaîne?" alors c'est un peu différent.
Correspondance complexe pour plusieurs un L'élément de tableau est le domaine du framework d'agrégation (ou éventuellement mapReduce, mais c'est beaucoup plus lent), où vous devez "filtrer" le contenu du tableau.
Vous commencez à peu près la même chose. La clé ici est de $unwind
pour "dénormaliser" le contenu du tableau afin de pouvoir "filtrer" correctement en tant que documents individuels. Puis reconstruisez le tableau avec les documents "correspondants".
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) {
}
)