Du svarade nästan själv på detta i dina taggar. MongoDB har en $regex
operator som tillåter att ett reguljärt uttryck skickas som en fråga. Så du frågar efter strängar som innehåller "Alex" gör du så här:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Du kan också göra detta:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Båda är giltiga och skiljer sig från hur du försökte i rätt syntax som stöds som visas i dokumentationen.
Men naturligtvis om du faktiskt frågar "hur får man 'array'-resultaten endast för de som matchar 'Alex' någonstans i strängen?" då är det här lite annorlunda.
Komplex matchning för mer än ett arrayelement är domänen för aggregeringsramverket (eller möjligen mapReduce, men det är mycket långsammare), där du måste "filtrera" arrayinnehållet.
Du börjar på ungefär samma sak. Nyckeln här är att $unwind
att "avnormalisera" arrayinnehållet för att kunna "filtrera" korrekt som enskilda dokument. Konstruera sedan om arrayen med de "matchande" dokumenten.
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) {
}
)