我的数据库中的文档如下所示:
"currency": "euro",
"_id": "605c88f480db631f542d4752",
"categoryName": "Food",
"categoryType": "spendings",
"amount": 45,
"description": "Mozarella buns",
"user": "603cf9f94ca6c518747e46bb",
"madeAt": "2021-03-25T12:58:28.690Z",
"__v": 0
目标是根据此类交易的数量生成一些图形。为了做到这一点,对于第一个,我需要获取过去 5 天内某个 categoryType 的所有交易的总和。我正在尝试这样做:
transRoutes.get('/getGraphData/:type/:daysAgo/:category/:defaultCurrency', async (req, res) => {
let startDate = moment().add(1, 'days').format('YYYY-MM-DD');
let endDate = moment().subtract(req.params.daysAgo, 'days').format('YYYY-MM-DD');
let queryParams = {};
if (req.params.category !== 'all') {
queryParams = { categoryType: req.params.type, madeAt: { $gte: endDate, $lte: startDate }, categoryName: req.params.category };
} else {
queryParams = { categoryType: req.params.type, madeAt: { $gte: endDate, $lte: startDate } };
}
Transaction.aggregate(
[
{
$match: queryParams
},
{
$group: {
_id: { $dateToString: { date: "$madeAt", format: "%Y-%m-%d" }, category: "$categoryType" } ,
amountSum : {$sum:'$amount'}
}
},
],
(err, result) =>{
if (err) {
res.send(err);
} else {
res.json(result);
}
}
);
但问题是日期是 ISODates,组函数不会对同一天的日期进行分组,因为它们具有不同的创建时间。我尝试按照上面的代码进行格式化,但出现 mongoError。
如果有人能帮助我理解我做错了什么,我将不胜感激。
谢谢, 阿德琳娜
答案 0 :(得分:2)
考虑您的数据是:
{ _id: ObjectId("5db07579f359d4a09a518ca6"),
modifyDate: 2021-04-19T15:00:00.000Z,
categoryName: 'Food',
amount: 5 }
{ _id: ObjectId("5db07579f359d4a09a518ca7"),
modifyDate: 2021-04-20T15:03:59.617Z,
categoryName: 'Food',
amount: 2 }
{ _id: ObjectId("5db07579f359d4a09a518ca8"),
modifyDate: 2021-04-20T15:03:59.617Z,
categoryName: 'Food',
amount: 1 }
您可以在第一级聚合进行投影以塑造您想要的数据,然后使用 $group 根据组合键进行求和
所以您的查询将是:
db.prod2.aggregate([
{ $project: { amount: 1, categoryName: 1, dayOfModifyDate: { $dateToString: { date: '$modifyDate', format: '%Y-%m-%d' } } } },
{
$group: {
_id: { dayOfModifyDate: '$dayOfModifyDate', categoryName: '$categoryName' },
amountSum: { $sum: '$amount' },
},
},
]);
结果
{ _id: { dayOfModifyDate: '2021-04-20', categoryName: 'Food' },
amountSum: 3 }
{ _id: { dayOfModifyDate: '2021-04-19', categoryName: 'Food' },
amountSum: 5 }