Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$where (query predicado operador)

$where

Utilice el operador $where para pasar una cadena que contenga una expresión JavaScript o una función JavaScript completa al sistema de consultas. El operador $where ofrece 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, utilice this o obj.

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.

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

  • Sin embargo, si necesita crear expresiones personalizadas, se prefiere$function a $where.

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

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()

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.

  • No utilices variables globales.

  • $where evalúa JavaScript y no puede aprovechar los índices. Por lo tanto, el rendimiento de la consulta mejora cuando se expresa la consulta utilizando los operadores estándar de MongoDB (por ejemplo, $gt, $in).

  • En general, solo debes usar $where cuando no puedas expresar tu consulta con otro operador. Si necesitas usar $where, intenta incluir al menos otro operador de consulta estándar para filtrar el conjunto de resultados. Usar $where por sí solo requiere un escaneo de la colección.

El uso de sentencias de consulta normales que no sean$where proporciona las siguientes ventajas de rendimiento:

  • MongoDB evaluará los componentes que no sean$where de la consulta antes de las sentencias $where. Si las sentencias que no sean$where no coinciden con ningún documento, MongoDB no realizará ninguna evaluación de consulta utilizando $where.

  • Las consultas que no sean$where pueden usar un índice.

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:

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 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.

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.