Necesito crear una consulta usando mongoose, que me permite usar el grupo, para contar los elementos que están en el estado INICIADO o NO INICIADO, y luego devolver el conteo de los elementos que están en cada uno de los estados.
Este es el objeto json con el que estoy trabajando.
[ { status: "INITIATED", _id: "6057e0013a3dec1d44a7d152", group: "dairy", location: "001", total_items: 30, __v: 0 }, { status: "INITIATED", _id: "6057e0013a3dec1d44a7d153", group: "dairy", location: "002", total_items: 45, __v: 0 }, { status: "INITIATED", _id: "6057e0013a3dec1d44a7d154", group: "dairy", location: "003", total_items: 12, __v: 0 }, { status: "NOT INITIATED", _id: "6057e0013a3dec1d44a7d155", group: "dairy", location: "004", total_items: 50, __v: 0 }, { status: "NOT INITIATED", _id: "6057e0013a3dec1d44a7d156", group: "drugs", location: "005", total_items: 23, __v: 0 }, { status: "NOT INITIATED", _id: "6057e0013a3dec1d44a7d157", group: "drugs", location: "006", total_items: 76, __v: 0 }]Por ejemplo, del grupo de lácteos necesito devolver un json con la siguiente estructura.
{ 'id': null, 'group': 'dairy', 'INITIATED': 3, 'NO INITIATED': 1 }Debido al grupo lácteo, 3 de los elementos están en estado INICIADO y uno de los elementos está en estado NO INICIADO. Otro ejemplo sería con el grupo de medicamentos que deberían devolver el siguiente json.
{ 'id': null, 'group': 'medications', 'STARTED': 0, 'NOT INITIATED': 2 }Para hacer esto, estoy tratando de hacer que funcione el siguiente código.
db.collection.aggregate ([ { "$ group": { _id: { source: "$ group", status: "$ status" }, count: { $ sum: 1 } } } ])Pero no tengo muy claro cómo usar el grupo para generar la respuesta como la necesito.
Ok, esto fue más complicado de lo que pensé al principio, pero así es como podrías hacerlo:
Primero, agrupe sus documentos por campo de grupo y sume los recuentos para el campo de estado. Estoy usando los operadores $cond y $eq para asegurarme de que el estado coincida con el campo de conteo. Finalmente, aplica $project para obtener el resultado deseado sin el campo _id :
db.collection.aggregate([ { "$group": { "_id": "$group", "NOT INITIATED": { "$sum": { "$cond": [ { "$eq": [ "$status", "NOT INITIATED" ] }, 1, 0] } }, "INITIATED": { "$sum": { "$cond": [ { "$eq": [ "$status", "INITIATED" ] }, 1, 0] } }, } }, { "$project": { "_id": 0, "group": "$_id", "INITIATED":1, "NOT INITIATED":1 } }])He creado un ejemplo en mongoplayground para ti: https://mongoplayground.net/p/H-72VzWoeoN