आप नीचे एकत्रीकरण का उपयोग कर सकते हैं:
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 ] }] } ] }
}
}
}
}
}
}
])
मूल रूप से n-th
. के मान की गणना करने के लिए तत्व आपको निम्नलिखित बातों को जानना होगा:
- पहले तत्व का बिक्री मूल्य (
$first
$group
. में ) - सभी
growths
की सरणी ($push
$group
. में ) n
जो इंगित करता है कि आपको कितने गुणन करने हैं
सूचकांक की गणना करने के लिए आपको $push
. करना चाहिए सभी तत्वों को एक सरणी में रखें और फिर $unwind
includeArrayIndex
. के साथ विकल्प जो index
. फ़ील्ड में अवांछित सरणी की अनुक्रमणिका सम्मिलित करेगा ।
अंतिम चरण संचयी गुणन की गणना करता है। यह $slice
का इस्तेमाल करता है index
. के साथ कितने growths
. का मूल्यांकन करने के लिए फ़ील्ड संसाधित किया जाना चाहिए। तो 601
. के लिए एक तत्व होगा , 602
. के लिए दो तत्व और इसी तरह।
फिर $reduce
का समय आ गया है उस सरणी को संसाधित करने और अपने सूत्र के आधार पर गुणा करने के लिए:(1 + (growth/100)
)