Bạn có thể sử dụng tổng hợp dưới đây:
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 ] }] } ] }
}
}
}
}
}
}
])
Về cơ bản để tính toán giá trị cho n-th
yếu tố bạn phải biết những điều sau:
- giá trị bán hàng của phần tử đầu tiên (
$first
trong$group
) - mảng của tất cả các
growths
($push
trong$group
) -
n
cho biết bạn phải thực hiện bao nhiêu phép nhân
Để tính toán chỉ số, bạn nên $push
tất cả các phần tử vào một mảng và sau đó sử dụng $unwind
với includeArrayIndex
tùy chọn sẽ chèn chỉ mục của mảng không được cuộn vào trường index
.
Bước cuối cùng tính toán nhân tích lũy. Nó sử dụng $ slice
với index
trường để đánh giá số lượng growths
nên được xử lý. Vì vậy, sẽ có một phần tử cho 601
, hai phần tử cho 602
và như vậy.
Sau đó, đã đến lúc giảm $
để xử lý mảng đó và thực hiện các phép nhân dựa trên công thức của bạn:(1 + (growth/100)
)