W ogóle nie powinno działać we wcześniejszych wersjach, ponieważ przynajmniej zmodyfikowałeś zasięg this
teraz odnosić się do „danych” jako elementu najwyższego poziomu. Krótko mówiąc, nie jest to już dozwolone i naprawdę nie powinieneś używać metod JavaScript, chyba że absolutnie musisz. Nawet wtedy w większości przypadków prawdopodobnie nadal istnieje lepszy sposób.
Ale w rzeczywistości jest to niepotrzebne użycie dopasowywania JavaScript, ponieważ nie jest wymagane, gdy istnieją inne operatory, które to zrobią.
Powinieneś używać $regex
zamiast tego:
db.docs.find({ "data.First_name": /^kim/i })
Lub gdziekolwiek w polu usuń karetkę ^
:
db.docs.find({ "data.First_name": /kim/i })
Co jest prawie tak nieefektywne, jak wykonywanie JavaScriptu, ale nie tak bardzo, jak nie ma narzutu związanego z przetwarzaniem przez ten silnik interpretera. I oczywiście działa wszędzie.
Zastanów się również, co faktycznie robi zapytanie oparte na JavaScript:
- Wywołuje instancję interpretera JavaScript
- Konwertuje typy dokumentów BSON na dokument na typy JavaScript
- Ocenia kod JavaScript w interpreterze dla każdego dokumentu
- Przesyła JavaScript
true|false
z powrotem jako wynik na dokument
Biorąc pod uwagę, że $regex
(ale z dopasowaniem nieuwzględniającym wielkości liter, które nie jest optymalne) wykonuje te same operacje, ale używa natywnie biblioteki "pcre" C bez konwersji i ponownego rzutowania na dokument, to oczywiście jest to rozsądny wybór z tych dwóch.