В этой задаче я хочу получить подписку пользователя на следующий временной диапазон
- Сегодня
- На этой неделе
- В этом месяце
- В этом году
Для этого временного диапазона я хочу отобразить $group
всех возможных дат.
[
{ Dates: '2020-05-21', Count: 3, AverageIncome: 30 },
{ Dates: '2020-05-22', Count: 10, AverageIncome: 30 },
{ Dates: '2020-05-24', Count: 1, AverageIncome: 37 },
{ Dates: '2020-05-25', Count: 1, AverageIncome: 30 },
{ Dates: '2020-05-26', Count: 2, AverageIncome: 65 }
]
Я также хочу добавить недостающие даты с данными аккумулятора, установленными на 0. Например, это должно быть
[
{ Dates: '2020-05-21', Count: 3, AverageIncome: 30 },
{ Dates: '2020-05-22', Count: 10, AverageIncome: 30 },
{ Dates: '2020-05-23', Count: 0, AverageIncome: 0 },
{ Dates: '2020-05-24', Count: 1, AverageIncome: 37 },
{ Dates: '2020-05-25', Count: 1, AverageIncome: 30 },
{ Dates: '2020-05-26', Count: 2, AverageIncome: 65 },
{ Dates: '2020-05-27', Count: 0, AverageIncome: 0 },
{ Dates: '2020-05-28', Count: 2, AverageIncome: 0 },
]
PS: В это время UT C время будет 28 мая, 23:45
Стадии конвейера агрегации, которые я использую
const $agg = await Subscription.aggregate([
{
$match: {
createdOn: {
$gte: moment(req.query.from).toDate(),
$lte: moment(req.query.to).toDate()
},
isCancelled: false
}
},
{
$group: {
_id: {
$dateToString: {
format: "%Y-%m-%d",
date: "$createdOn"
}
},
count: { $sum: 1 },
avgAmount: { $avg: "$amountPaid" }
}
},
{
$project: {
_id: false,
sortKey: {
$dateFromString: {
dateString: "$_id"
}
},
Dates: "$_id",
Count: "$count",
AverageIncome: "$avgAmount"
}
},
{
$sort: {
sortKey: 1
}
},
{
$project: {
sortKey: false
}
}
]);