Definição
$functionImportante
JavaScript do lado do servidor obsoleto
A partir do MongoDB,8.0 as funções JavaScript do lado do servidor
$accumulator$function(,,$where) estão obsoletas. O MongoDB registra um aviso quando você executa essas funções.Define uma função de agregação personalizada ou expressão em JavaScript.
Você pode usar o operador para definir funções personalizadas para implementar comportamentos não compatíveis com a linguagem de query do MongoDB .
$functionConsulte$accumulatortambém.Importante
Executar JavaScript dentro de uma expressão de agregação pode diminuir o desempenho. Use o
$functionoperador somente se os operadores de pipeline fornecidos não puderem atender às necessidades do seu aplicativo.
Sintaxe
O operador tem a seguinte $function sintaxe:
{ $function: { body: <code>, args: <array expression>, lang: "js" } }
Campo | Tipo | Descrição |
|---|---|---|
String ou código | A definição de função. Você pode especificar a definição da função como código ou string dos tipos de BSON. Consulte também lang.
ou
| |
Array | Argumentos passados para o corpo da função. Se a função body não receber um argumento, você poderá especificar uma array Os elementos de array podem ser qualquer tipo BSON, incluindo Código. 2Consulte Exemplo: alternativa | |
String |
Considerações
Restrição de validação do esquema
Você não pode utilizar como parte $function de um predicado de query de validação de esquema .
Javascript Enablement
Para usar, você deve ter o script do lado do servidor habilitado $function (padrão).
Se você não usar $function (ou, ou), desabilite os scripts do lado do $accumulator $where mapReduceservidor:
Para uma instância
mongod, consulte opção de configuraçãosecurity.javascriptEnabledou opção de linha de comando--noscripting.Para instâncias do
mongos, consulte a opção de configuraçãosecurity.javascriptEnabledou a opção de linha de comando--noscripting.Em versões anteriores, o MongoDB não permite a execução de JavaScript em instâncias
mongos.
Consulte também ➤ Executar o MongoDB com opções de configuração seguras.
Alternativa para $where
O operador de query $where também pode ser utilizado para especificar a expressão JavaScript. No entanto:
O operador
$exprpermite o uso de expressões de agregação dentro do idioma da query.$functione permitem que os usuários definam expressões de agregação personalizadas em JavaScript se os operadores de pipeline fornecidos não atenderem às necessidades do seu$accumulatoraplicativo.
Considerando os operadores de aggregation disponíveis:
Funções de array e string não suportadas
O MongoDB atualiza o 6.0 mecanismo JavaScript interno usado para expressões JavaScript,, e do lado$accumulator do$function $where servidor e do MozJS- para60 o91 MozJS-. Várias funções de array e string de caracteres não padrão obsoletas que existiam no MozJS-60 são removidas no91 MozJS-.
Exemplos
Exemplo 1: Exemplo de uso
Crie uma coleção de amostra denominada players com os seguintes 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 ] } ])
A seguinte operação de agregação utiliza o $addFields para adicionar novos campos a cada documento:
isFoundcujo valor é determinado pela$functionexpressão personalizada que verifica se o5 hash MD do nome é igual a um hash especificado.messagecujo valor é determinado pela$functionexpressão personalizada que formata uma mensagem de string utilizando um modelo.
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" } } } } ] )
A operação retorna os seguintes 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." }
Dica
A partir do MongoDB 8.3, você pode usar $hexHash como uma alternativa de agregação nativa a hex_md5. $hexHash não requer JavaScript do lado do servidor e é compatível com os algoritmos SHA-256 e GB64, além de MD5. Observe que $hexHash retorna uma string hexadecimal maiúscula, enquanto hex_md5 retorna minúsculas. MD5 é um algoritmo legado e está desabilitado no modo FIPS.
Exemplo 2: Alternativa a $where
Observação
Alternativas de agregação preferidas acima de $where
O operador permite $expr o uso de expressões de agregação dentro do idioma da consulta. E $function e $accumulator permitem que os usuários definam expressões de agregação personalizadas em JavaScript se os operadores de pipeline fornecidos não atenderem às necessidades do seu aplicativo.
Considerando os operadores de aggregation disponíveis:
Como alternativa a uma query que usa o operador,$where você pode usar e. Por $expr exemplo, considere o exemplo $function $where a seguir .
db.players.find( { $where: function() { return (hex_md5(this.name) == "15b0a220baa16331e8d80e15367677ad") } } );
A operação db.collection.find() retorna o seguinte documento:
{ "_id" : 2, "name" : "Miss Ann Thrope", "scores" : [ 10, 10, 10 ] }
O exemplo pode ser expresso utilizando $expr $functione:
db.players.find( {$expr: { $function: { body: function(name) { return hex_md5(name) == "15b0a220baa16331e8d80e15367677ad"; }, args: [ "$name" ], lang: "js" } } } )