Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$expr (operador de predicado de consulta)

Modificado en la versión 5.0.

$expr

Permite el uso del expresiones dentro de un query predicate.

Puedes usar $expr para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

{ $expr: { <expression> } }

Los argumentos pueden ser cualquier expresión válida.

Cuando $expr aparece en una etapa $match que es parte de una subpipeline $lookup, $expr puede referirse a let variables definidas por la etapa $lookup. Para ver un ejemplo, consulta Usar varias condiciones de unión y una subconsulta correlacionada.

Los operadores de comparación $eq, $lt, $lte, $gt y $gte colocados en un operador $expr pueden utilizar un índice en la colección from referenciada en una etapa $lookup. Limitaciones:

  • Los índices solo pueden utilizarse para comparaciones entre campos y constantes, por lo que el operando let debe resolverse en una constante.

    Por ejemplo, una comparación entre $a y un valor constante puede utilizar un índice, pero una comparación entre $a y $b no puede.

  • Los índices no se utilizan para comparaciones donde el operando let se resuelve en un valor vacío o faltante.

  • No se utilizan índicesmulticlave, parciales o dispersos.

Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación de MongoDB autogestionada, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.

$expr puede contener expresiones que comparen campos del mismo documento.

La siguiente operación utiliza para encontrar documentos en $expr la movies colección donde la calificación de los espectadores de Rotten Tomatoes supera la calificación de los críticos:

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 } } }
]

Algunas consultas requieren lógica condicional al definir un filtro. La canalización de agregación proporciona el operador para expresar sentencias condicionales. Al $cond usar $expr con el operador, puede especificar un filtro condicional para su $cond consulta.

Supongamos que desea calcular una puntuación ponderada para las películas de manera que las películas mejor valoradas con pocos votos no dominen los resultados:

  • Si imdb.votes es mayor o igual que 1000, la puntuación ponderada es el valor completo de imdb.rating.

  • Si imdb.votes es menor que 1000, la puntuación ponderada es 0.5 de imdb.rating.

Te gustaría saber qué películas de la colección movies tienen una puntuación ponderada mayor que 9.

El siguiente ejemplo utiliza $expr con para calcular la puntuación ponderada en función $cond de imdb.votes y $gt para devolver documentos cuya puntuación ponderada calculada sea mayor 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)

La siguiente tabla muestra la puntuación ponderada de los documentos seleccionados y si la puntuación ponderada es mayor que 9 (es decir, si el documento cumple la condición de la consulta).

Documento
Puntuación 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

La operación db.collection.find() devuelve 5 documentos cuya puntuación ponderada calculada es mayor 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 } }
]

Aunque calcula una puntuación ponderada, esta no se refleja en los documentos devueltos. En cambio, los documentos devueltos representan los documentos coincidentes en su estado $cond original.

Volver

Misceláneo

En esta página