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

$función (operador de expresión)

$function

Importante

JavaScript del lado del servidor está obsoleto

A partir de MongoDB,8.0 las funciones JavaScript del lado del servidor$accumulator $function(,, $where) están obsoletas. MongoDB registra una advertencia cuando se ejecutan estas funciones.

Define una función o expresión de agregación personalizada en JavaScript.

Puedes usar el $function operador para definir funciones personalizadas que implementen comportamientos no compatibles con el lenguaje de consulta de MongoDB. Consulta $accumulator también.

Importante

La ejecución de JavaScript dentro de una expresión de agregación puede disminuir el rendimiento. Utilice el $function operador únicamente si los operadores de canalización disponibles no satisfacen las necesidades de su aplicación.

El operador tiene la siguiente $function sintaxis:

{
$function: {
body: <code>,
args: <array expression>,
lang: "js"
}
}
Campo
Tipo
Descripción

string o código

La definición de la función. Puede especificar la definición de la función como tipo BSON Código o Cadena. Consulte también lang.

function(arg1, arg2, ...) { ... }

or

"function(arg1, arg2, ...) { ... }"

Arreglo

Argumentos pasados ​​al cuerpo de la función. Si el cuerpo de la función no toma ningún argumento, puede especificar una matriz [ ] vacía.

Los elementos de la matriz pueden ser de cualquier tipo BSON, incluido Código. Véase el 2Ejemplo: Alternativa a.$where

String

El idioma utilizado en el cuerpo. Debe lang: "js" especificar.

No se puede utilizar como parte $function de un predicado de consulta de validación de esquema.

Para usar, debe tener habilitado el scripting del lado del servidor $function (predeterminado).

Si no utiliza $function (o, o), desactive la ejecución de scripts del lado del $accumulator $where mapReduceservidor:

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

El operador del query $where también puede utilizarse para especificar expresiones de JavaScript. Sin embargo:

  • El operador $expr permite el uso de expresiones de agregación dentro del lenguaje de la query.

  • Los $function y permiten a los usuarios definir expresiones de agregación personalizadas en JavaScript si los operadores de canalización proporcionados no pueden satisfacer las necesidades de su $accumulator aplicación.

Dado los operadores de agregación disponibles:

  • El uso de con operadores de agregación que $expr $function $accumulator no utilizan JavaScript (es decir, operadores que no son ni) 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$function prefiere $where a.

MongoDB 6.0 actualiza el motor JavaScript interno utilizado para JavaScript del lado del servidor, $accumulator $functionexpresiones, y y de MozJS- $where a60 91MozJS-. Varias funciones de matriz y cadena obsoletas y no estándar que existían en MozJS-60 se eliminan en MozJS-.91

Crea una colección de muestra llamada players con los siguientes documentos:

db.players.insertMany([
{ _id: 1, name: "Miss Cheevous", scores: [ 10, 5, 10 ] },
{ _id: 2, name: "Miss Ann Thrope", scores: [ 10, 10, 10 ] },
{ _id: 3, name: "Mrs. Eppie Delta ", scores: [ 9, 8, 8 ] }
])

La siguiente operación de agregación utiliza $addFields para añadir nuevos campos a cada documento:

  • isFound cuyo valor está determinado por la $function expresión personalizada que comprueba si el5 hash MD del nombre es igual a un hash especificado.

  • message cuyo valor está determinado por la $function expresión personalizada que formatea un mensaje de cadena usando una plantilla.

db.players.aggregate( [
{ $addFields:
{
isFound:
{ $function:
{
body: function(name) {
return hex_md5(name) == "15b0a220baa16331e8d80e15367677ad"
},
args: [ "$name" ],
lang: "js"
}
},
message:
{ $function:
{
body: function(name, scores) {
let total = Array.sum(scores);
return `Hello ${name}. Your total score is ${total}.`
},
args: [ "$name", "$scores"],
lang: "js"
}
}
}
}
] )

La operación devuelve los siguientes documentos:

{ "_id" : 1, "name" : "Miss Cheevous", "scores" : [ 10, 5, 10 ], "isFound" : false, "message" : "Hello Miss Cheevous. Your total score is 25." }
{ "_id" : 2, "name" : "Miss Ann Thrope", "scores" : [ 10, 10, 10 ], "isFound" : true, "message" : "Hello Miss Ann Thrope. Your total score is 30." }
{ "_id" : 3, "name" : "Mrs. Eppie Delta ", "scores" : [ 9, 8, 8 ], "isFound" : false, "message" : "Hello Mrs. Eppie Delta . Your total score is 25." }

Tip

A partir de MongoDB 8.3, puedes utilizar $hexHash como una alternativa nativa de agregación a hex_md5. $hexHash no requiere JavaScript en el lado del servidor y admite los algoritmos SHA-256 y XXH64 además de MD5. Tenga en cuenta que $hexHash devuelve una string hexadecimal en mayúsculas, mientras que hex_md5 devuelve en minúsculas. MD5 es un algoritmo heredado y está desactivado en el modo FIPS.

Nota

Alternativas de agregación preferidas sobre $where

El $expr operador permite el uso de expresiones de agregación dentro del lenguaje de consulta. Los $function operadores y permiten a los usuarios definir expresiones $accumulator de agregación personalizadas en JavaScript si los operadores de canalización proporcionados no satisfacen las necesidades de su aplicación.

Dado los operadores de agregación disponibles:

  • El uso de con operadores de agregación que $expr $function $accumulator no utilizan JavaScript (es decir, operadores que no son ni) 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$function prefiere $where a.

Como alternativa a una consulta que utiliza el operador,$where puede utilizar y. Por $expr ejemplo, considere el $function $where siguiente ejemplo.

db.players.find( { $where: function() {
return (hex_md5(this.name) == "15b0a220baa16331e8d80e15367677ad")
} } );

La operación db.collection.find() devuelve el siguiente documento:

{ "_id" : 2, "name" : "Miss Ann Thrope", "scores" : [ 10, 10, 10 ] }

El ejemplo se puede expresar usando $expr $functiony:

db.players.find( {$expr: { $function: {
body: function(name) { return hex_md5(name) == "15b0a220baa16331e8d80e15367677ad"; },
args: [ "$name" ],
lang: "js"
} } } )