$expr (Consulta com Expressão de Agregação)
Última atualização: 2026-10-09
$expr (Consulta com Expressão de Agregação)
$expr permite que predicados de consulta usem expressões de agregação — comparando vários campos do mesmo documento ou chamando operadores de agregação. `{ $expr: { $gt: ['$price', '$cost'] } }` encontra produtos com preço acima do custo; o prefixo $ referencia valores de campo. $expr geralmente não pode usar índices (suporte parcial desde o MongoDB 6.0), então use-o com moderação em coleções grandes.
| Categoria | Elemento e Avaliação |
|---|---|
| Versão do MongoDB | 3.6+ |
| Idioma do Exemplo | mongosh (Shell) |
📝 Sintaxe
{ $expr: { <expressão de agregação> } }
⚙️ Parâmetros
| expressão de agregação | Uma expressão de agregação, por exemplo { $gt: ['$price', '$cost'] }; $ referencia valores de campo. |
|---|
Retorno:Cursor dos documentos correspondentes
▶ Exemplo
Execute os comandos abaixo no seu mongosh local (requer um mongod em execução):
// $expr: produtos com preço acima do custo
// $price referencia o valor do campo
db.products.find({ $expr: { $gt: ['$price', '$cost'] } })
// Compara dois campos por igualdade
db.users.find({ $expr: { $eq: ['$email', '$username'] } })
Saída:
// Retorna produtos onde price excede cost; usuários cujo email é igual ao username
📌 Notas
- O prefixo $ referencia valores de campo, igual aos pipelines de agregação
- Geralmente não pode usar índices; suporte parcial desde o 6.0
- Prefira operadores simples sempre que eles puderem expressar a consulta
🏷️ Tags Relacionados
💡 Casos Relacionados
$lookup e associações com múltiplos conjuntos
Operadores de consulta: um guia completo com mais de 30 operadores
📚 Tutoriais Relacionados
❓ Perguntas Frequentes
QComo $expr compara dois campos de um documento?
AReferencie campos com $: { $expr: { $gt: ['$price', '$cost'] } }.
Q$expr pode usar um índice?
AGeralmente não; desde o MongoDB 6.0 alguns casos (ex.: comparações de intervalo) podem usar um índice.
QQual é a diferença entre $expr e $where?
A$expr usa expressões de agregação (recomendado); $where executa JavaScript (lento, sem índices).