Puede utilizar la siguiente agregación:
db.ccpsample.aggregate([
{ $sort: { ccp_id: 1, period: 1 } },
{
$group: {
_id: "$ccp_id",
items: { $push: "$$ROOT" },
baseSale: { $first: "$sales" },
growths: { $push: "$growth" }
}
},
{
$unwind: {
path: "$items",
includeArrayIndex: "index"
}
},
{
$project: {
cpp_id: "$items.cpp_id",
period: "$items.period",
growth: "$items.growth",
sales: {
$cond: {
if: { $ne: [ "$items.sales", "NULL" ] },
then: "$items.sales",
else: {
$reduce: {
input: { $slice: [ "$growths", "$index" ] },
initialValue: "$baseSale",
in: { $multiply: [ "$$value", { $add: [1, { $divide: [ "$$this", 100 ] }] } ] }
}
}
}
}
}
}
])
Básicamente para calcular el valor de n-th
elemento que tienes que saber las siguientes cosas:
- valor de venta del primer elemento (
$first
en$group
) - la matriz de todos los
growths
($push
en$group
) - el
n
que indica cuántas multiplicaciones tienes que realizar
Para calcular el índice debes $push
todos los elementos en una matriz y luego use $unwind
con includeArrayIndex
opción que insertará el índice de la matriz desenrollada en el campo index
.
El último paso calcula la multiplicación acumulativa. Utiliza $slice
con index
campo para evaluar cuántos growths
debe ser procesado. Entonces habrá un elemento para 601
, dos elementos para 602
y así sucesivamente.
Entonces es hora de $reduce
para procesar esa matriz y realizar las multiplicaciones según su fórmula:(1 + (growth/100)
)