Het had in eerdere versies helemaal niet moeten werken, aangezien je op zijn minst de scoping van this
hebt gewijzigd om nu naar "gegevens" te verwijzen als een element op het hoogste niveau. Kortom, dit is niet langer toegestaan en je zou eigenlijk geen JavaScript-methoden moeten gebruiken, tenzij het absoluut moet. Zelfs dan is er in de meeste gevallen waarschijnlijk nog een betere manier.
Maar in feite is dit een onnodig gebruik van JavaScript-matching, omdat het niet vereist is wanneer er andere operators zijn die dit kunnen doen.
Je zou een $regex
formulier in plaats daarvan:
db.docs.find({ "data.First_name": /^kim/i })
Of ergens in het veld, verwijder het caret ^
:
db.docs.find({ "data.First_name": /kim/i })
Dat is vrijwel net zo inefficiënt als de uitvoering van JavaScript, maar niet zoveel als er geen overhead is voor verwerking via die interpreter-engine. En natuurlijk werkt het overal.
Denk ook na over wat een query die op JavaScript moet worden opgelost eigenlijk doet:
- Vraagt een JavaScript-interpreterinstantie aan
- Converteert BSON-documenttypen per document naar JavaScript-typen
- Evalueert JavaScript-code in de tolk per document
- Cast JavaScript
true|false
terug als resultaat per document
Gezien het feit dat $regex
( maar met een hoofdletterongevoelige overeenkomst die niet optimaal is ) dezelfde bewerkingen uitvoert maar de "pcre" C-bibliotheek native gebruikt zonder conversie en herschikking per document, dan is het duidelijk de verstandige keuze van de twee.