Sie können die folgende Aggregation verwenden:
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 ] }] } ] }
}
}
}
}
}
}
])
Grundsätzlich um den Wert für n-th zu berechnen Element müssen Sie folgende Dinge wissen:
- Verkaufswert des ersten Elements (
$firstin$group) - das Array aller
growths($pushin$group) - der
ndie angibt, wie viele Multiplikationen Sie durchführen müssen
Um den Index zu berechnen, sollten Sie $push alle Elemente in einem Array und verwenden Sie dann $unwind
mit includeArrayIndex Option, die den Index des abgewickelten Arrays in das Feld index einfügt .
Der letzte Schritt berechnet die kumulative Multiplikation. Es verwendet $slice
mit index Feld, um auszuwerten, wie viele growths verarbeitet werden soll. Es wird also ein Element für 601 geben , zwei Elemente für 602 und so weiter.
Dann ist es Zeit für $reduce
um dieses Array zu verarbeiten und die Multiplikationen basierend auf Ihrer Formel durchzuführen:(1 + (growth/100) )