Definición
$functionImportante
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
$functionoperador para definir funciones personalizadas que implementen comportamientos no compatibles con el lenguaje de consulta de MongoDB. Consulta$accumulatortambién.Importante
La ejecución de JavaScript dentro de una expresión de agregación puede disminuir el rendimiento. Utilice el
$functionoperador únicamente si los operadores de canalización disponibles no satisfacen las necesidades de su aplicación.
Sintaxis
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.
or
| |
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 Los elementos de la matriz pueden ser de cualquier tipo BSON, incluido Código. Véase el 2Ejemplo: Alternativa a. | |
String | El idioma utilizado en el cuerpo. Debe |
Considerations
Restricción de validación de esquema
No se puede utilizar como parte $function de un predicado de consulta de validación de esquema.
Javascript Enablement
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:
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.En versiones anteriores, MongoDB no permite la ejecución de JavaScript en instancias de
mongos.
Consulta también ➤ Ejecutar MongoDB con opciones de configuración seguras.
Alternativa a $where
El operador del query $where también puede utilizarse para especificar expresiones de JavaScript. Sin embargo:
El operador
$exprpermite el uso de expresiones de agregación dentro del lenguaje de la query.Los
$functiony 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$accumulatoraplicación.
Dado los operadores de agregación disponibles:
El uso de con operadores de agregación que
$expr$function$accumulatorno utilizan JavaScript (es decir, operadores que no son ni) es más rápido que$whereporque no ejecuta JavaScript y debería preferirse si es posible.
Funciones de string y arreglo no compatibles
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
Ejemplos
Ejemplo 1: Ejemplo de uso
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:
isFoundcuyo valor está determinado por la$functionexpresión personalizada que comprueba si el5 hash MD del nombre es igual a un hash especificado.messagecuyo valor está determinado por la$functionexpresió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.
Ejemplo 2: Alternativa a $where
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$accumulatorno utilizan JavaScript (es decir, operadores que no son ni) es más rápido que$whereporque no ejecuta JavaScript y debería preferirse si es posible.
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" } } } )