Hai quasi risposto tu stesso nei tuoi tag. MongoDB ha un $regex
operatore che consente di inviare un'espressione regolare come query. Quindi esegui una query per le stringhe contenenti "Alex" fai questo:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Puoi anche farlo:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Entrambi sono validi e diversi da come hai provato nella corretta sintassi supportata come mostrato nella documentazione.
Ma ovviamente se stai effettivamente chiedendo "come ottenere i risultati 'array' solo per quelli che corrispondono a 'Alex' da qualche parte nella stringa?" allora questo è un po' diverso.
Corrispondenza complessa per più di uno elemento array è il dominio del framework di aggregazione (o eventualmente mapReduce, ma è molto più lento), dove è necessario "filtrare" il contenuto dell'array.
Inizi più o meno allo stesso modo. La chiave qui è $unwind
per "denormalizzare" il contenuto dell'array per poter "filtrare" correttamente come singoli documenti. Quindi ricostruisci l'array con i documenti "corrispondenti".
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) {
}
)