Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

MongoDB sum aggregation with conditionals

I am working on an aggregation to perform some analytics on an Orders object, i want to get the total price from every order from the previous month, and the total from this month, I tried passing in the $match parameter, with the appropriate time conditionals but its not aggregating any of the data. even though if i perform a countDocuments query with the same time conditionals i get a number of documents returned.

    const totalThis = await Order.aggregate([
      {
        $match: {
          // should cut the amount of orders off at the beginning of the current month
          createdAt: { $gte: thisMonth.getMonth() + 1 },
        },
      },
      {
        $group: {
          // using $group, _id has to be there or it doesnt
          // return anything, though we dont need an _id
          _id: null,
          total: {
            $sum: "$totalPrice",
          },
        },
      },
    ]);
    res.status(200).json({
      lastMonth: lastMonthSales,
      thisMonth: thisMonthSales,
      totalSalesLast: totalLast,
      totalSalesThis: totalThis,
    });

in my Postman request, lastMonth returns 0, so it would make sense that the array returned to totalSalesLast would be empty, however thisMonth returns 5 documents, so it should work. obviously if i remove the $match conditional it will aggregate all the documents, but thats because its doing ALL the documents and not actually filtering.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

To query the document with createdAt in specific month, your $match stage should be as below:

  1. $month – Take the month value from createdAt.
  2. $eq – Compare both month from (1) and input month are same.
{
  $match: {
    $expr: {
      $eq: [
        {
          "$month": "$createdAt"
        },
        thisMonth.getMonth() + 1
      ]
    }
  }
}

Sample Mongo Playground

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading