sql >> Base de Datos >  >> NoSQL >> MongoDB

$elemmatch no funciona en MongoDB

No debería haber funcionado en versiones anteriores, ya que al menos has modificado el alcance de this para referirse ahora a "datos" como un elemento de nivel superior. En resumen, esto ya no está permitido y realmente no debería usar métodos de JavaScript a menos que sea absolutamente necesario. Incluso entonces, probablemente todavía haya una mejor manera en la mayoría de los casos.

Pero, de hecho, este es un uso innecesario de la coincidencia de JavaScript, ya que no es necesario cuando existen otros operadores que harán esto.

Debería usar un $regex formulario en su lugar:

db.docs.find({ "data.First_name": /^kim/i })

O en cualquier lugar dentro del campo, elimine el signo de intercalación ^ :

db.docs.find({ "data.First_name": /kim/i })

Lo cual es casi tan ineficiente como la ejecución de JavaScript, pero no tanto como la sobrecarga de procesamiento a través de ese motor de interpretación. Y, por supuesto, funciona en todas partes.

Piense también en lo que realmente está haciendo una consulta que depende de JavaScript para resolver:

  • Invoca una instancia de intérprete de JavaScript
  • Convierte tipos de documentos BSON por documento a tipos de JavaScript
  • Evalúa código JavaScript en el intérprete por documento
  • Emite JavaScript true|false volver como resultado por documento

Teniendo en cuenta que $regex (pero con una coincidencia que no distingue entre mayúsculas y minúsculas que no es óptima) está haciendo las mismas operaciones pero usando la biblioteca C "pcre" de forma nativa sin conversión y refundición por documento, entonces es claramente la elección más sana de las dos.