Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Menu Docs
Página inicial do Docs
/ /

$expr (operador de predicado da query)

Alterado na versão 5.0.

$expr

Permite o uso de expressões dentro de um predicado de query.

Você pode utilizar o $expr 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

{ $expr: { <expression> } }

O argumento pode ser qualquer expressão válida.

Quando $expr aparece em um estágio $match que faz parte de um subpipeline $lookup, $expr pode se referir a variáveis let definidas pelo estágio $lookup. Para obter um exemplo, consulte Usar várias condições de junção e uma subquery correlacionada.

Os operadores de comparação $eq, $lt, $lte, $gt e $gte colocados em um operador $expr podem utilizar um índice na coleção from referenciada em um estágio $lookup. Limitações:

  • Os índices só podem ser usados para comparações entre campos e constantes, portanto, o operando let deve ser resolvido para uma constante.

    Por exemplo, uma comparação entre $a e um valor constante pode usar um índice, mas uma comparação entre $a e $b não pode.

  • Os índices não são usados para comparações onde o operando let resolve para um valor vazio ou ausente.

  • Índices multichave, parciais ou esparsos não são usados.

Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.

$expr pode conter expressões que comparam campos do mesmo documento.

A operação a seguir usa para encontrar documentos $expr na movies collection em que a classificação do visualizador do Rotten Tomatoes excede a classificação do crítico:

db.movies.find(
{ $expr: { $gt: [ "$tomatoes.viewer.rating", "$tomatoes.critic.rating" ] } },
{ _id: 0, title: 1, "tomatoes.viewer.rating": 1, "tomatoes.critic.rating": 1 }
).sort( { "tomatoes.viewer.rating": -1 } ).limit( 3 )
[
{ title: 'I Am Maria', tomatoes: { viewer: { rating: 5 } } },
{ title: 'Kadin Hamlet', tomatoes: { viewer: { rating: 5 } } },
{ title: 'The Seine Meets Paris', tomatoes: { viewer: { rating: 5 } } }
]

Algumas queries precisam executar lógica condicional ao definir um filtro de query. O agregação pipeline fornece ao operador para expressar instruções condicionais.$cond Usando $expr com o operador, você pode especificar um filtro condicional para sua declaração de $cond query.

Suponha que você queira calcular uma pontuação ponderada para filmes de forma que os filmes bem avaliados com poucos votos não dominem os resultados:

  • Se imdb.votes for maior ou igual a 1000, a pontuação ponderada é o imdb.rating completo.

  • Se imdb.votes for inferior a 1000, a pontuação ponderada é 0.5 do imdb.rating.

Você gostaria de saber quais filmes da coleção movies têm uma pontuação ponderada maior que 9.

O exemplo a seguir usa $expr com para calcular a pontuação ponderada com base $cond em imdb.votes e para retornar documentos cuja pontuação ponderada $gt calculada é maior 9 que:

db.movies.find(
{
"imdb.rating": { $type: "number" },
"imdb.votes": { $type: "number" },
$expr: {
$gt: [
{
$cond: {
if: { $gte: ["$imdb.votes", 1000] },
then: { $multiply: ["$imdb.rating", 1.0] },
else: { $multiply: ["$imdb.rating", 0.5] }
}
},
9
]
}
},
{ _id: 0, title: 1, "imdb.rating": 1, "imdb.votes": 1 }
).sort( { title: 1 } ).limit(5)

A tabela a seguir mostra a pontuação ponderada para documentos selecionados e se a pontuação ponderada é maior que 9 (ou seja, se o documento atende à condição de query).

Documento
Pontuação Ponderada
> 9

{ title: "The Shawshank Redemption", imdb: { rating: 9.3, votes: 1521105 } }

9.3

true

{ title: "The Godfather", imdb: { rating: 9.2, votes: 1038358 } }

9.2

true

{ title: "Fight Club", imdb: { rating: 8.9, votes: 1191784 } }

8.9

false

{ title: "Planet Earth", imdb: { rating: 9.5, votes: 82896 } }

9.5

true

{ title: "Hollywood", imdb: { rating: 9.1, votes: 511 } }

4.55

false

A operação db.collection.find() retorna 5 documentos cuja pontuação ponderada calculada é maior 9 que:

[
{ title: 'Band of Brothers', imdb: { rating: 9.6, votes: 183802 } },
{ title: 'Baseball', imdb: { rating: 9.1, votes: 2460 } },
{ title: 'Cosmos', imdb: { rating: 9.3, votes: 17174 } },
{ title: 'Frozen Planet', imdb: { rating: 9.2, votes: 5903 } },
{ title: 'Human Planet', imdb: { rating: 9.2, votes: 9057 } }
]

Embora calcule uma pontuação ponderada, essa pontuação não é refletida nos documentos retornados. Em vez disso, os documentos retornados representam os documentos correspondentes em seu estado $cond original.

Voltar

Diversos

Nesta página