Docs Menu
Docs Home
/ /
query de evaluación

$where

$where

Utilice el operador $where para pasar al sistema del query ya sea un string que contenga una expresión de JavaScript o una función completa de JavaScript. El $where ofrece 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 usando this o obj .

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.

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 $expr con operadores de agregación que no utilizan JavaScript (es decir, operadores no-$function y no-$accumulator) son más rápidos que $where porque no ejecutan JavaScript y deberían preferirse si es posible.

  • Sin embargo, si debes crear expresiones personalizadas, se prefiere $function en lugar de $where.

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
args
MaxKey
MinKey
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()

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.

  • No utilices variables globales.

  • $where evalú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 $where solo 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 $where por sí solo requiere un escaneo de colección.

El uso de instrucciones del query normales no-$where proporciona las siguientes ventajas de rendimiento:

  • MongoDB evaluará los componentes no-$where del query antes de las instrucciones $where. Si las instrucciones no-$where no coinciden con ningún documento, MongoDB no realizará ninguna evaluación del query usando $where.

  • Las instrucciones del query no-$where pueden usar un índice.

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:

Consulta también ➤ Ejecutar MongoDB con opciones de configuración seguras.

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.

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.

Volver

$regex

En esta página