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.

Cómo obtener un conteo simple y agrupar por en MongoDB?

Suponiendo que tengo un conjunto de datos que tiene dos categorías, por ejemplo, fútbol o baloncesto, donde el valor de fútbol es 1 y el valor de baloncesto es 2, y tenemos los siguientes datos:

_id    juego
'1'      1
'2'      1
'3'      2
'4'      1
'5'      2

(los datos contienen fútbol 3 veces y baloncesto 2 veces).

Quiero realizar una agregación que devuelva el siguiente objeto:

{
   contadorFútbol: 3,
   contadorBaloncesto: 2
}

No puedo pensar en una agregación que resulte en tal estructura. ¿Cómo puedo hacer esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes utilizar el marco de agregación de MongoDB y el operador $group. Aquí tienes un ejemplo de tubería de agregación que puedes utilizar:

    db.collection.aggregate([
      {
        $group: {
          _id: "$game",
          count: { $sum: 1 }
        }
      },
      {
        $group: {
          _id: null,
          footballCount: {
            $sum: {
              $cond: { if: { $eq: ["$_id", 1] }, then: "$count", else: 0 }
            }
          },
          basketballCount: {
            $sum: {
              $cond: { if: { $eq: ["$_id", 2] }, then: "$count", else: 0 }
            }
          }
        }
      },
      {
        $project: {
          _id: 0,
          footballCount: 1,
          basketballCount: 1
        }
      }
    ]);
    

    Esta tubería primero agrupa los documentos por el campo game y calcula el recuento de cada valor utilizando el operador $sum. Luego, agrupa el resultado nuevamente para calcular los recuentos finales para el fútbol y el baloncesto utilizando el operador $cond para sumar condicionalmente los recuentos según el valor _id. Finalmente, la etapa $project se utiliza para eliminar el campo _id del resultado.

    Esto debería devolver el objeto deseado:

    {
      "footballCount": 3,
      "basketballCount": 2
    }
    

Comments are closed.