Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$onde

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Propriedades e funções JavaScript disponíveis
  • elemMatch
  • Considerações
  • Capacitação em JavaScript
  • Exemplo
$where

Utilize o operador $where para transmitir uma string contendo uma expressão JavaScript ou uma função JavaScript completa para o sistema de query. $where fornece maior flexibilidade, mas exige que o banco de dados processe a expressão ou função JavaScript para cada documento na collection. Consulte o documento na expressão ou função JavaScript usando this ou obj .

Você pode utilizar o $where para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem

O operador $where tem o seguinte formato:

{ $where: <string|JavaScript Code> }

Observação

$where não é mais compatível com o código JavaScript dos tipos de BSON obsoleto com escopo (tipo de BSON 15). O operador $where suporta apenas a string dos tipos de BSON (tipo de BSON 2) ou JavaScript dos tipos de BSON (tipo de BSON 13). O uso do JavaScript do tipo de BSON com escopo para $where ficou obsoleto desde o MongoDB 4.2.1.

Observação

Alternativas de aggregation preferidas

O operador $expr permite o uso de expressões de agregação dentro do idioma da query. $function e $accumulator permitem que os usuários definam expressões de agregação personalizadas no JavaScript se os operadores de pipeline fornecidos não puderem atender às necessidades do seu aplicativo.

Considerando os operadores de aggregation disponíveis:

  • O uso de $expr com operadores de agregação que não usam JavaScript (ou seja, operadores não$function e não$accumulator ) é mais rápido do que $where porque não executa JavaScript e deve ser preferido, se possível.

  • No entanto, se você precisar criar expressões customizadas, prefere-se { $function a $where.

As expressões de operador map-reduce operations e $where não podem acessar determinadas funções ou propriedades globais, como db, que estão disponíveis em mongosh.

As seguintes funções e propriedades JavaScript estão disponíveis para as expressões de operador map-reduce operations e $where :

Propriedades disponíveis
Funções disponíveis
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 apenas o operador de query $where a documentos de nível superior. O operador de query $where não funcionará dentro de um documento aninhado, por exemplo, em uma query $elemMatch .

  • Não use variáveis globais.

  • $where avalia JavaScript e não pode aproveitar os índices. Portanto, o desempenho da query melhora quando você a expressa usando os operadores padrão do MongoDB (por exemplo, $gt, $in).

  • Em geral, você deve usar $where somente quando não puder expressar sua query usando outro operador. Se você precisar usar $where, tente incluir pelo menos um outro operador de query padrão para filtrar o conjunto de resultados. O uso apenas $where requer uma verificação da collection.

O uso de declarações de query normais não$where oferece as seguintes vantagens de desempenho:

  • O MongoDB avaliará componentes que não sejam$where de query antes das declarações $where . Se as declarações que não sejam$where não corresponderem a nenhum documento, o MongoDB não realizará nenhuma avaliação de query usando $where.

  • As declarações de query que não sejam$where podem usar um índice.

Para usar $where (ou $function, $accumulator ou mapReduce), você deve ter o script do lado do servidor habilitado (padrão).

No entanto, se você não usar essas operações, desabilite os scripts do lado do servidor:

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

Considere os seguintes documentos na collection 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" }
])

O exemplo seguinte utiliza $where e a função JavaScript hex_md5() para comparar o valor do campo name com um hash MD5 e retorna qualquer documento correspondente.

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

A operação retorna o seguinte resultado:

{
"_id" : 2,
"name" : "Anya",
"username" : "anya",
"first_login" : "2001-02-02"
}

Como alternativa, o exemplo anterior pode ser reescrito usando $expr e $function. Você pode definir uma expressão de aggregation personalizada no JavaScript com o operador de aggregation $function. Para acessar $function e outros operadores de aggregation em db.collection.find(), use com $expr:

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

Se você precisar criar expressões customizadas, prefere-se { $function a $where.

← $text