如何在 MongoDB 聚合中格式化组函数的日期

时间:2021-04-20 12:13:37

标签: javascript mongodb

我的数据库中的文档如下所示:

        "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。

如果有人能帮助我理解我做错了什么,我将不胜感激。

谢谢, 阿德琳娜

1 个答案:

答案 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 }