Prawie sam odpowiedziałeś na to w swoich tagach. MongoDB ma $regex
operator, który umożliwia przesłanie wyrażenia regularnego jako zapytania. Więc pytasz o ciągi zawierające „Alex”, robisz to:
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
Możesz również to zrobić:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
Oba są prawidłowe i różnią się od sposobu, w jaki próbowałeś, we właściwej obsługiwanej składni, jak pokazano w dokumentacji.
Ale oczywiście, jeśli rzeczywiście pytasz „jak uzyskać wyniki „tablicy” tylko dla tych, które pasują do „Alex” gdzieś w ciągu? to jest trochę inne.
Złożone dopasowanie dla więcej niż jednego element tablicy jest domeną struktury agregacji (lub ewentualnie mapReduce, ale jest to znacznie wolniejsze ), gdzie trzeba "filtrować" zawartość tablicy.
Zaczynasz od tego samego. Kluczem tutaj jest $unwind
do "denormalizacji" zawartości tablicy, aby móc właściwie "filtrować" jako pojedyncze dokumenty. Następnie zrekonstruuj tablicę z „pasującymi” dokumentami.
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) {
}
)