Não deveria ter funcionado em versões anteriores, pois pelo menos você modificou o escopo de
this
para agora se referir a "dados" como um elemento de nível superior. Resumindo, isso não é mais permitido e você realmente não deveria usar métodos JavaScript, a menos que seja absolutamente necessário. Mesmo assim, provavelmente ainda há uma maneira melhor na maioria dos casos. Mas, na verdade, esse é um uso desnecessário de correspondência de JavaScript, pois não é necessário quando existem outros operadores que farão isso.
Você deve usar um
$regex
formulário em vez disso:db.docs.find({ "data.First_name": /^kim/i })
Ou em qualquer lugar dentro do campo, remova o acento circunflexo
^
:db.docs.find({ "data.First_name": /kim/i })
O que é praticamente tão ineficiente quanto a execução do JavaScript, mas não tanto quanto não há a sobrecarga de processamento por meio desse mecanismo de interpretação. E é claro que funciona em todos os lugares.
Pense também no que uma consulta que depende de JavaScript para resolver está realmente fazendo:
- Invoca uma instância do interpretador JavaScript
- Converte tipos de documentos BSON por documento em tipos JavaScript
- Avalia o código JavaScript no interpretador por documento
- Transmite JavaScript
true|false
de volta como resultado por documento
Considerando que
$regex
( mas com uma correspondência insensível a maiúsculas e minúsculas que não é ideal ) está fazendo as mesmas operações, mas usando a biblioteca C "pcre" nativamente sem conversão e reformulação por documento, então é claramente a escolha sensata dos dois.