Du svarede næsten selv på dette i dine tags. MongoDB har en $regex
operator, der tillader, at et regulært udtryk sendes som en forespørgsel. Så du forespørger efter strenge, der indeholder "Alex", gør du dette:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Du kan også gøre dette:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Begge er gyldige og forskellige fra hvordan du prøvede i den korrekte understøttede syntaks som vist i dokumentationen.
Men selvfølgelig, hvis du rent faktisk spørger "hvordan får man 'array'-resultaterne kun for dem, der matcher 'Alex' et eller andet sted i strengen?" så er det lidt anderledes.
Kompleks matching for mere end én array-elementet er domænet for aggregeringsrammen (eller muligvis mapReduce, men det er meget langsommere), hvor du skal "filtrere" array-indholdet.
Du starter med stort set det samme. Nøglen her er at $unwind
at "de-normalisere" array-indholdet for at kunne "filtrere" korrekt som individuelle dokumenter. Rekonstruer derefter arrayet med de "matchende" dokumenter.
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) {
}
)