Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
$onde
Nesta página
Definição
$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 usandothis
ouobj
.
Compatibilidade
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
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão código-disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
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
.
Comportamento
Propriedades e funções JavaScript disponíveis
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() |
elemMatch
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
.
Considerações
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:
Capacitação em JavaScript
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:
Para uma instância
mongod
, consulte opção de configuraçãosecurity.javascriptEnabled
ou opção de linha de comando--noscripting
.Para uma instância
mongos
, consulte a opção de configuraçãosecurity.javascriptEnabled
ou a opção de linha de comando--noscripting
.
Consulte também ➤ Executar o MongoDB com opções de configuração seguras.
Exemplo
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
.