Mi pregunta es, dados pocos documentos como este
{ deliveryDay: "2021-01-14", plate: { name: "pasta", quantity: 1 } } { deliveryDay: "2021-01-16", plate: { name: "pasta", quantity: 3 } } { deliveryDay: "2021-01-16", plate: { name: "pizza", quantity: 2 } }
¿Hay una manera de obtener el resultado deseado a continuación? Traté de tener un campo con nombre personalizado con $addFields
como este {"$deliveryDay": "$plate.quantity" }
pero me da un error no válido. La agregación no es un problema y estoy dentro del marco de agregación, por lo que necesito hacerlo usando etapas de canalización de agregación.
resultado atendido:
{ "2021-01-14": 1, "2021-01-16": 3, plate: { name: "pasta" } } { "2021-01-14": 0, "2021-01-16": 2, plate: { name: "pizza" } }
Entonces la idea es:
deliveryDay
y plate.name
para obtener la suma de plate.quantity
.name
para generar una matriz de formato [{ k: "", v: "" }]
.{ k: "plate", v: { name: "$_id" } }
en la matriz anterior.array
en un objeto usando $arrayToObject .Solución en el parque infantil de Mongo . Prueba esto:
db.testCollection.aggregate([ { $group: { _id: { dDate: "$deliveryDay", name: "$plate.name" }, sumOfQty: { $sum: "$plate.quantity" } } }, { $group: { _id: "$_id.name", array: { $push: { k: "$_id.dDate", v: "$sumOfQty" } } } }, { $addFields: { array: { $concatArrays: ["$array", [{ k: "plate", v: { name: "$_id" } }]] } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$array" } } } ]);
Producción
/* 1 */ { "2021-01-16" : 2, "plate" : { "name" : "pizza" } }, /* 2 */ { "2021-01-14" : 1, "2021-01-16" : 3, "plate" : { "name" : "pasta" } }