Je hebt dit bijna zelf beantwoord in je tags. MongoDB heeft een $regex
operator waarmee een reguliere expressie als een query kan worden ingediend. Dus als je zoekt naar strings die "Alex" bevatten, doe je dit:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Je kunt dit ook doen:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Beide zijn geldig en verschillen van hoe je het hebt geprobeerd in de juiste ondersteunde syntaxis zoals getoond in de documentatie.
Maar natuurlijk, als je je echt afvraagt:"hoe krijg je de 'array'-resultaten alleen voor de resultaten die ergens in de string met 'Alex' overeenkomen?' dan is dit een beetje anders.
Complexe overeenkomsten voor meer dan één array-element is het domein van het aggregatieraamwerk (of mogelijk mapReduce, maar dat is veel langzamer), waar u de array-inhoud moet "filteren".
Je begint ongeveer hetzelfde. De sleutel hier is om $unwind
om de array-inhoud te "de-normaliseren" om op de juiste manier te kunnen "filteren" als afzonderlijke documenten. Reconstrueer vervolgens de array met de "overeenkomstige" documenten.
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) {
}
)