$where (Expressão JavaScript)
Última atualização: 2026-10-09
$where (Expressão JavaScript)
$where avalia uma expressão JavaScript como o predicado de consulta. `{ $where: 'this.credits == this.debits' }`. Ele é executado no servidor, é lento, não pode usar índices, e o MongoDB recomenda $expr em vez dele. Use-o apenas quando $expr não puder expressar a lógica (ex.: funções JS personalizadas) e proteja-se contra injeção.
| Categoria | Elemento e Avaliação |
|---|---|
| Versão do MongoDB | 1.0+ |
| Idioma do Exemplo | mongosh (Shell) |
📝 Sintaxe
{ $where: <expressão JavaScript> }
⚙️ Parâmetros
| expressão JS | Uma expressão JavaScript que retorna um booleano; this refere-se ao documento atual. |
|---|
Retorno:Cursor dos documentos correspondentes
▶ Exemplo
Execute os comandos abaixo no seu mongosh local (requer um mongod em execução):
// $where: registros onde credits é igual a debits (JS)
db.accounts.find({ $where: 'this.credits == this.debits' })
// Recomendado: $expr é mais rápido
db.accounts.find({ $expr: { $eq: ['$credits', '$debits'] } })
Saída:
// Ambos retornam o mesmo resultado, mas $expr tem melhor desempenho
📌 Notas
- Executa JavaScript no servidor, não pode usar índices, desempenho ruim
- Prefira $expr (MongoDB 3.6+)
- Risco de injeção: nunca concatene entrada do usuário em $where
🏷️ Tags Relacionados
💡 Casos Relacionados
Mais casos práticos em breve.
📚 Tutoriais Relacionados
❓ Perguntas Frequentes
QPor que $where é lento?
AEle avalia JavaScript por documento no servidor, sem suporte a índices.
QComo escolho entre $where e $expr?
APrefira $expr: melhor desempenho e suporte a índices; use $where apenas para lógica JS personalizada.
Q$where tem riscos de segurança?
ASim. Concatenar entrada do usuário na string permite injeção; parametrize ou mude para $expr.