MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

$elemmatch não funciona no MongoDB


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.