Definición
$whereUtilice el operador
$wherepara pasar una cadena que contenga una expresión JavaScript o una función JavaScript completa al sistema de consultas. El operador$whereofrece mayor flexibilidad, pero requiere que la base de datos procese la expresión o función JavaScript para cada documento de la colección. Para hacer referencia al documento en la expresión o función JavaScript, utilicethisoobj.
Compatibilidad
Puedes usar $where para implementaciones alojadas en los siguientes entornos:
- MongoDB Atlas: El servicio totalmente administrado para implementaciones de MongoDB en la nube.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El operador $where tiene la siguiente forma:
{ $where: <string|JavaScript Code> }
Nota
$where ya no admite el código JavaScript de tipo BSON obsoleto con ámbito (tipo BSON 15). El operador $where solo admite el tipo BSON String (tipo BSON 2) o el tipo BSON JavaScript (tipo BSON 13). El uso del tipo BSON JavaScript con ámbito para $where ha sido obsoleto desde MongoDB 4.2.1.
Nota
Alternativas de agregación preferidas
El operador $expr permite el uso de expresiones de agregación dentro del lenguaje de la query. El $function y el $accumulator permiten a los usuarios definir expresiones de agregación personalizadas en JavaScript si los operadores del pipeline proporcionados no pueden satisfacer las necesidades de la aplicación.
Dado los operadores de agregación disponibles:
El uso de
$exprcon operadores de agregación que no utilizan JavaScript (es decir, operadores que no son$functionni$accumulator) es más rápido que$whereporque no ejecuta JavaScript y debería preferirse si es posible.
Comportamiento
Propiedades y funciones disponibles de JavaScript
Las expresiones de operadormap-reduce operations y $where no pueden acceder a ciertas funciones o propiedades globales, como db, que están disponibles en mongosh.
Las siguientes funciones y propiedades de JavaScript están disponibles para las expresiones de los operadores map-reduce operations y $where:
Propiedades disponibles | Funciones disponibles | |
|---|---|---|
|
|
|
elemMatch
Aplique el operador de consulta $where únicamente a documentos de nivel superior. El operador de consulta $where no funcionará dentro de un documento anidado, por ejemplo, en una consulta $elemMatch.
Considerations
No utilices variables globales.
El uso de sentencias de consulta normales que no sean$where proporciona las siguientes ventajas de rendimiento:
MongoDB evaluará los componentes que no sean
$wherede la consulta antes de las sentencias$where. Si las sentencias que no sean$whereno coinciden con ningún documento, MongoDB no realizará ninguna evaluación de consulta utilizando$where.
JavaScript Enablement
Para usar $where (o $function, $accumulator o mapReduce), debe tener habilitado el scripting del lado del servidor (predeterminado).
Sin embargo, si no utiliza estas operaciones, desactive el script del lado del servidor:
Para una instancia de
mongod, consulta la opción de configuraciónsecurity.javascriptEnabledo la opción de línea de comandos--noscripting.Para una instancia
mongos, consulta la opción de configuraciónsecurity.javascriptEnabledo la opción de línea de comandos--noscripting.
Consulta también ➤ Ejecutar MongoDB con opciones de configuración seguras.
Funciones de string y arreglo no compatibles
MongoDB 6.0 actualiza el motor JavaScript interno utilizado para JavaScript del lado del servidor, $accumulator, $function y $where expresiones, y pasa de MozJS-60 a MozJS-91. Varias funciones de matriz y cadena obsoletas y no estándar que existían en MozJS-60 se eliminan en MozJS-91.
Ejemplo
Considera los siguientes documentos en la colección players:
db.players.insertMany([ { _id: 12378, name: "Steve", username: "steveisawesome", first_login: "2017-01-01" }, { _id: 2, name: "Anya", username: "anya", first_login: "2001-02-02" } ])
El siguiente ejemplo utiliza $where y la función JavaScript hex_md5() para comparar el valor del campo name con un hash MD5 y devuelve cualquier documento coincidente.
db.players.find( { $where: function() { return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994") } } );
La operación devuelve el siguiente resultado:
{ "_id" : 2, "name" : "Anya", "username" : "anya", "first_login" : "2001-02-02" }
Como alternativa, el ejemplo anterior puede reescribirse utilizando $expr y $function. Puedes definir una expresión de agregación personalizada en JavaScript con el operador de agregación $function. Para acceder a $function y otros operadores de agregación en db.collection.find(), utiliza con $expr:
db.players.find( {$expr: { $function: { body: function(name) { return hex_md5(name) == "9b53e667f30cd329dca1ec9e6a83e994"; }, args: [ "$name" ], lang: "js" } } } )
Si necesita crear expresiones personalizadas, se prefiere$function a $where.