Definição
$whereUtilize o operador para transmitir uma string contendo uma expressão JavaScript
$whereou uma função JavaScript completa para o sistema de query. fornece maior flexibilidade, mas exige que o banco$wherede dados processe a expressão ou função JavaScript para cada documento na collection. Consulte o documento na expressão ou função JavaScript usandothisobjou.
Compatibilidade
Você pode utilizar o $where para implantações hospedadas nos seguintes ambientes:
- MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
O operador tem o seguinte $where 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 15 BSON). O operador suporta apenas $where a string dos tipos de BSON (tipo de 2 BSON) ou JavaScript dos tipos de BSON (tipo 13 de BSON). O uso do JavaScript do tipo de BSON com escopo para ficou obsoleto a partir do $where MongoDB...421
Observação
Alternativas de aggregation preferidas
O operador $expr permite o uso de expressões de agregação dentro da linguagem de query. O $function e o $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:
Comportamento
Propriedades e funções JavaScript disponíveis
map-reduce operations As $where expressões de operador e não podem acessar determinadas funções ou propriedades globais,db como, que estão disponíveis mongosh em.
As seguintes funções e propriedades do JavaScript estão disponíveis para map-reduce operations $where as expressões de operador e:
Propriedades disponíveis | Funções disponíveis | |
|---|---|---|
|
|
|
elemMatch
Aplique apenas o $where operador de query a documentos de nível superior. O $where operador de query não funcionará dentro de um documento aninhado, por exemplo, em uma $elemMatch query.
Considerações
Não use variáveis globais.
O uso de$where declarações de query normais não fornece as seguintes vantagens de desempenho:
O MongoDB avaliará
$wherecomponentes que não sejam de query antes das$wheredeclarações. Se as declarações que não$wheresejam não corresponderem a nenhum documento, o MongoDB não realizará nenhuma avaliação de$wherequery usando.
JavaScript Enablement
Para usar $where (ou, ou), você deve ter o script do lado do servidor habilitado $function $accumulator mapReduce(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.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.
Consulte também ➤ Executar o MongoDB com opções de configuração seguras.
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-.
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 a seguir usa e $where a hex_md5() função JavaScript para comparar o valor do name campo com um5 hash MD 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 utilizando $expr e $function. Você pode definir uma expressão de agregação personalizada em JavaScript com o operador de agregação $function. Para acessar $function e outros operadores de agregação 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, $function prefere-se $where a.