Запрос вычисления Mongodb--кумулятивное умножение
недавно я начал работать в Mongodb для POC. У меня есть одна коллекция json ниже
db.ccpsample.insertMany([
{
"ccp_id":1,
"period":601,
"sales":100.00
},
{
"ccp_id":1,
"period":602,
"growth":2.0,
"sales":"NULL" ##sales=100.00*(1+(2.0/100)) -- 100.00 comes from(ccp_id:1 and period=601)
},
{
"ccp_id":1,
"period":603,
"growth":3.0,
"sales":"NULL" ##sales=100.00*(1+(2.0/100))**(1+(3.0/100))-- 100.00 comes from(ccp_id:1 and period=601) 2.0 comes from (ccp_id:2 and period=602)
},
{
"ccp_id":2,
"period":601,
"sales":200.00
},
{
"ccp_id":2,
"period":602,
"growth":2.0,
"sales":"NULL" ##sales=200.00*(1+(2.0/100))
},
{
"ccp_id":2,
"period":603,
"growth":3.0,
"sales":"NULL" ##same like above
}
])
и мне нужно вычислить поле продаж, которое имеет значение NULL, используя вышеуказанные документы с условиями соответствия ccp_id должно совпадать, а поле периода должно быть равно 601. Я добавил строку, чтобы продемонстрировать поле расчет продаж в самой коллекции выше. Я пробовал с $graphlookup, но не повезло. Можете ли вы, люди, любезно помочь или предложить какой-то способ?
1 ответов
вы можете использовать ниже агрегации:
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
) - the
n
что указывает, сколько умножения вы должны выполнить
для расчета индекса необходимо $push
все элементы в один массив а затем используйте $unwind
С includeArrayIndex
опция, которая вставит индекс разматываемого массива в поле index
.
последний шаг вычисляет кумулятивное умножение. Он использует $ slice С index
поле для оценки, сколько growths
должны быть обработаны. Таким образом, будет один элемент для 601
, два элемента 602
и так далее.
тогда пришло время для $уменьшить для обработки этого массива и выполнения умножения на основе вашей формулы: (1 + (growth/100)
)