Vous pouvez utiliser l'agrégation ci-dessous :
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 ] }] } ] }
}
}
}
}
}
}
])
Fondamentalement, pour calculer la valeur de n-th
élément, vous devez savoir les choses suivantes :
- valeur des ventes du premier élément (
$first
dans$group
) - le tableau de toutes les
growths
($push
dans$group
) - le
n
qui indique combien de multiplications vous devez effectuer
Pour calculer l'indice, vous devez $push
tous les éléments dans un tableau, puis utilisez $unwind
avec includeArrayIndex
option qui insérera l'index du tableau déroulé dans le champ index
.
La dernière étape calcule la multiplication cumulée. Il utilise $slice
avec index
champ pour évaluer le nombre de growths
doit être traité. Il y aura donc un élément pour 601
, deux éléments pour 602
et ainsi de suite.
Alors il est temps pour $reduce
pour traiter ce tableau et effectuer les multiplications en fonction de votre formule :(1 + (growth/100)
)