Definición
$whereUtilice el operador
$wherepara pasar al sistema del query ya sea un string que contenga una expresión de JavaScript o una función completa de JavaScript. El$whereofrece mayor flexibilidad, pero requiere que la base de datos procese la expresión o función de JavaScript para cada documento de la colección. Se debe hacer referencia al documento en la expresión o función de JavaScript usandothisoobj.
Compatibilidad
Puedes usar $where para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado 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 cuenta con el soporte para el código JavaScript desactualizado de tipo BSON con alcance (tipo BSON 15). El operador $where solo admite el string tipo BSON (Tipo BSON 2) o el JavaScript tipo BSON (Tipo BSON 13). El uso de JavaScript tipo BSON con alcance para $where está desactualizado 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 no-$functiony no-$accumulator) son más rápidos que$whereporque no ejecutan JavaScript y deberían preferirse si es posible.Sin embargo, si debes crear expresiones personalizadas, se prefiere
$functionen lugar de$where.
Comportamiento
Propiedades y funciones disponibles de JavaScript
Las expresiones de operador map-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 map-reduce operations y $where expresiones de operadores:
Propiedades disponibles | Funciones disponibles | |
|---|---|---|
argsMaxKeyMinKey | assert()BinData()DBPointer()DBRef()doassert()emit()gc()HexData()hex_md5()isNumber()isObject()ISODate()isString() | Map()MD5()NumberInt()NumberLong()ObjectId()print()printjson()printjsononeline()sleep()Timestamp()tojson()tojsononeline()tojsonObject()UUID()version() |
elemMatch
Aplica solo el operador del query$where a documentos de nivel superior. El operador del query $where no funcionará dentro de un documento anidado, por ejemplo, en un query $elemMatch.
Considerations
No utilices variables globales.
$whereevalúa JavaScript y no puede aprovechar los índices. Por lo tanto, el rendimiento de la query mejora cuando se expresa la query usando los operadores estándar de MongoDB (por ejemplo,$gt,$in).En general, se debe utilizar
$wheresolo cuando no se pueda expresar la query utilizando otro operador. Si se debe utilizar$where, es necesario incluir al menos otro operador de la query estándar para filtrar el set de resultados. El uso de$wherepor sí solo requiere un escaneo de colección.
El uso de instrucciones del query normales no-$where proporciona las siguientes ventajas de rendimiento:
JavaScript Enablement
Para usar $where (o $function, $accumulator, o mapReduce), debes tener activado el scripting del lado del servidor (por defecto).
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 y pasa de MozJS-60 a MozJS-91. Varias funciones de arreglo y de string no estándar desactualizadas que existían en MozJS-60 se eliminaron en MozJS-91.
Para obtener la lista completa de funciones de cadena y matriz eliminadas, consulte las 6.0 notas de compatibilidad.
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 debes crear expresiones personalizadas, se prefiere $function sobre $where.