es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Selección de valores por encima del promedio en MongoDB.

Estoy tratando de encontrar los productos cuyo precio está por encima del precio promedio.
Sé cómo obtener el promedio:

db.products.aggregate([{ 
  "$group": {
    "_id": null, 
    "promedio": { "$avg": "$precio" } 
  }
},
{ $project : { _id : 0 } } ])

Pero ¿cómo puedo usarlo en una cláusula $gt?
Por ejemplo, intenté guardar el resultado en una variable:

var valorPromedio = 
db.products.aggregate([{ 
  "$group": {
    "_id": null, 
    "promedio": { "$avg": "$precio" } 
  }
},
{ $project : { _id : 0 } } ])

Y luego usarlo en la cláusula $gt:

db.products.find({ "precio": { "$gt": valorPromedio} })

Sin embargo, parece que no me imprime nada.
También me pregunto si esto es posible hacerlo en una sola consulta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para usar el valor promedio en una cláusula $gt, puedes utilizar la etapa $match en la canalización de agregación para filtrar los documentos basados en el precio. Aquí tienes un ejemplo de consulta que encuentra productos cuyo precio está por encima del precio promedio en una sola canalización:

    db.products.aggregate([
      // Calcular el precio promedio
      { "$group": {
        "_id": null,
        "average": { "$avg": "$price" }
      }},
      // Filtrar los productos cuyo precio está por encima del promedio
      { "$match": {
        "price": { "$gt": "$average" }
      }}
    ])
    

    Esta consulta primero calcula el precio promedio utilizando la etapa $group. Luego utiliza la etapa $match para filtrar los documentos con un precio mayor que el precio promedio. El resultado será una lista de productos cuyo precio está por encima del promedio.

    Ten en cuenta que el operador de agregación $avg devuelve un número de punto flotante, por lo que es posible que necesites utilizar el operador $trunc para redondear el valor promedio al entero más cercano si deseas compararlo con un campo de precio entero.

Comments are closed.