De oplossing van Chris Fulstow werkt (+1), maar is misschien niet efficiënt, vooral niet als uw verzameling erg groot is. Niet-geroote reguliere expressies (die niet beginnen met ^
, die de reguliere expressie verankert aan het begin van de tekenreeks), en degenen die de i
. gebruiken vlag voor hoofdletterongevoeligheid zal geen indexen gebruiken, zelfs als ze bestaan.
Een alternatieve optie die u zou kunnen overwegen, is om uw gegevens te denormaliseren om een kleine versie van de name
op te slaan. veld, bijvoorbeeld als name_lower
. U kunt dat vervolgens efficiënt opvragen (vooral als het is geïndexeerd) voor niet-hoofdlettergevoelige exacte overeenkomsten zoals:
db.collection.find({"name_lower": thename.toLowerCase()})
Of met een prefix-overeenkomst (een geroote reguliere expressie) als:
db.collection.find( {"name_lower":
{ $regex: new RegExp("^" + thename.toLowerCase(), "i") } }
);
Beide zoekopdrachten gebruiken een index op name_lower
.