V dřívějších verzích by to vůbec nemělo fungovat, protože jste alespoň upravili rozsah this
nyní odkazovat na "data" jako na prvek nejvyšší úrovně. Stručně řečeno, toto již není povoleno a opravdu byste neměli používat metody JavaScriptu, pokud to absolutně nemusíte. I v takovém případě pravděpodobně ve většině případů stále existuje lepší způsob.
Ale ve skutečnosti se jedná o zbytečné použití shody JavaScriptu, protože není vyžadováno, pokud existují další operátoři, kteří to provedou.
Měli byste používat $regex
místo toho formulář:
db.docs.find({ "data.First_name": /^kim/i })
Nebo kdekoli v poli odeberte stříšku ^
:
db.docs.find({ "data.First_name": /kim/i })
Což je v podstatě stejně neefektivní jako provádění JavaScriptu, ale ne tak moc, jako není režie zpracování přes tento interpretační engine. A samozřejmě to funguje všude.
Zamyslete se také nad tím, co vlastně dělá dotaz založený na JavaScriptu:
- Vyvolá instanci interpretu JavaScript
- Převede typy dokumentů BSON na dokument na typy JavaScript
- Vyhodnocuje kód JavaScript v interpretu podle dokumentu
- Odešle JavaScript
true|false
zpět jako výsledek podle dokumentu
Vzhledem k tomu, že $regex
(ale se shodou nerozlišující malá a velká písmena, která není optimální) provádí stejné operace, ale nativně používá knihovnu "pcre" C bez konverze a přetypování na dokument, pak je to jednoznačně rozumná volba.