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
}
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:
Esto debería darle el resultado deseado: