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.

MongoDB: Contar el número total de valores verdaderos y falsos para documentos que coinciden con una consulta.

Mi pregunta es exactamente igual que esta:

https://stackoverflow.com/questions/27945060/mongodb-count-total-number-of-true-and-false-values-for-documents-matching-a-que

He seguido la misma solución pero no obtengo el resultado deseado.

Tengo algunos registros de productos en la base de datos. Algunos son gratis y otros no. Quiero recuperar la cantidad de productos gratuitos y no gratuitos. Estos son mis registros:

{ "_id" : ObjectId("54abcdbeba070410146d6073"), "name" : "Producto 1", "isFree" : true}
{ "_id" : ObjectId("54afe32fec4444481b985711"), "name" : "Producto 2", "isFree" : false}
{ "_id" : ObjectId("54b66de68dde7a0c19be987b"), "name" : "Producto 3", "isFree" : false}
{ "_id" : ObjectId("54b66de68dde7a0c19bc897d"), "name" : "Producto 4", "isFree" : false}

Espero obtener la salida como:

{
   "free": 1,
   "nonFree": 3
}

Este es mi consulta:

db.collection.aggregate([
  {
    "$group": {
      "_id": "$isFree",
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$group": {
      _id: null,
      free: {
        $sum: {
          $cond: ["$_id",1,0]
        }
      },
      nonFree: {
        $sum: {
          $cond: ["$_id",0,1]
        }
      }
    }
  }
])

Obtengo la salida:

{
    "_id": null,
    "free": 2,
    "nonFree": 0
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay un problema con la segunda etapa $group de la tubería de agregación. Las expresiones $cond en los operadores $sum deben hacer referencia al campo “isFree” en lugar del campo “_id”. Aquí está la consulta corregida:

    db.collection.aggregate([
      {
        "$group": {
          "_id": "$isFree",
          "count": {
            "$sum": 1
          }
        }
      },
      {
        "$group": {
          "_id": null,
          "free": {
            "$sum": {
              "$cond": [
                { "$eq": ["$_id", true] },
                1,
                0
              ]
            }
          },
          "nonFree": {
            "$sum": {
              "$cond": [
                { "$eq": ["$_id", false] },
                1,
                0
              ]
            }
          }
        }
      }
    ])
    

    Esto debería darle el resultado deseado:

    {
      "free": 1,
      "nonFree": 3
    }
    

Comments are closed.