Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$function (operador de expressão )

$function

Importante

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 .$function Consulte $accumulator também.

Importante

Executar JavaScript dentro de uma expressão de agregação pode diminuir o desempenho. Use o $function operador somente se os operadores de pipeline fornecidos não puderem atender às necessidades do seu aplicativo.

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.

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

ou

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

Array

Argumentos passados para o corpo da função. Se a função body não receber um argumento, você poderá especificar uma array [ ] vazia.

Os elementos de array podem ser qualquer tipo BSON, incluindo Código. 2Consulte Exemplo: alternativa $where para.

String

O idioma usado no corpo. Você deve lang: "js" especificar.

Você não pode utilizar como parte $function de um predicado de query de validação de esquema .

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:

Consulte também ➤ Executar o MongoDB com opções de configuração seguras.

O operador de query $where também pode ser utilizado para especificar a expressão JavaScript. No entanto:

  • O operador $expr permite o uso de expressões de agregação dentro do idioma da query.

  • $function e 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 $accumulator aplicativo.

Considerando os operadores de aggregation disponíveis:

  • O uso do$exprcom operadores de agregação que não utilizam JavaScript (ou seja, operadores não$functione não$accumulator) é mais rápido do que$whereporque não executa JavaScript e deve ser preferido, se possível.

  • No entanto, se você precisar criar expressões personalizadas, é$function preferível $where a.

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

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:

  • isFound cujo valor é determinado pela $function expressão personalizada que verifica se o5 hash MD do nome é igual a um hash especificado.

  • message cujo valor é determinado pela $function expressã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.

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:

  • O uso do$exprcom operadores de agregação que não utilizam JavaScript (ou seja, operadores não$functione não$accumulator) é mais rápido do que$whereporque não executa JavaScript e deve ser preferido, se possível.

  • No entanto, se você precisar criar expressões personalizadas, é$function preferível $where a.

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"
} } } )