mtwallet
mtwallet

Reputation: 5086

Mongodb aggregate based on past date

I am trying to perform a query in Mongodb. The query I'd like to perform is find all orders in a collection based on date (7 days past), then add up the prices with the nested objects for each order. I have the following code so far:

Collection/Data

{
    "_id" : "g32fYpydfSFDbFkoi",
    "orderNumber" : 1234,
    "createdAt" : ISODate("2016-01-12T13:50:17.559Z"),
    "productsInOrder" : [
        {
            "category" : "ambient",
            "item" : 23982,
            "desc" : "Ergonomic Cotton Sausages",
            "quantity" : "456",
            "price" : "0.54",
            "lineprice" : "246.24",
            "_id" : "BdD4QnM7sYTwBpLds"
        },
        {
            "category" : "ambient",
            "item" : 15336,
            "desc" : "Rustic Wooden Chicken",
            "quantity" : "2",
            "price" : "1.87",
            "lineprice" : "3.74",
            "_id" : "PvtSxi2MfYrZNTD6f"
        },
        {
            "category" : "chilled",
            "item" : 57584,
            "desc" : "Unbranded Soft Chicken",
            "quantity" : "3",
            "price" : "4.69",
            "lineprice" : "14.07",
            "_id" : "ppkECqmhPvg7pQcgB"
        },
        {
            "category" : "ambient",
            "item" : 71168,
            "desc" : "Rustic Rubber Computer",
            "quantity" : "5",
            "price" : "3.04",
            "lineprice" : "15.20",
            "_id" : "bZtr5dkvsG92YtLoe"
        },
        {
            "category" : "frozen",
            "item" : 87431,
            "desc" : "Unbranded Granite Sausages",
            "quantity" : "5678",
            "price" : "1.98",
            "lineprice" : "11242.44",
            "_id" : "ZKur3rHhtCLsWiENr"
        },
        {
            "category" : "frozen",
            "item" : 75007,
            "desc" : "Practical Frozen Towels",
            "quantity" : "678",
            "price" : "1.19",
            "lineprice" : "806.82",
            "_id" : "g78zvzoE8wJkciD9C"
        },
        {
            "category" : "frozen",
            "item" : 84721,
            "desc" : "Fantastic Metal Hat",
            "quantity" : "34",
            "price" : "1.83",
            "lineprice" : "62.22",
            "_id" : "4aqxBWhXy5cabbbiM"
        },
        {
            "category" : "frozen",
            "item" : 72240,
            "desc" : "Fantastic Granite Towels",
            "quantity" : "1",
            "price" : "2.94",
            "lineprice" : "2.94",
            "_id" : "MQD2LNv36mE3BWvZJ"
        },
        {
            "category" : "chilled",
            "item" : 89448,
            "desc" : "Intelligent Concrete Towels",
            "quantity" : "6678",
            "price" : "0.42",
            "lineprice" : "2804.76",
            "_id" : "AjRrxFT4mfpxuciC4"
        },
        {
            "category" : "chilled",
            "item" : 57584,
            "desc" : "Unbranded Soft Chicken",
            "quantity" : "1111",
            "price" : "4.69",
            "lineprice" : "5210.59",
            "_id" : "4yBspve6mBNNzqDnZ"
        }
    ]
  }

Query

Orders.aggregate([
    { $match: { 'createdAt': { $gt: pastDate }}},
    { $unwind: '$productsInOrder' },
    {
      $group: {
        _id: null,
        price: {
          $sum: '$productsInOrder.price'
        }
      }
    }
]);

What I ultimately want is to output the total price per day for the last 7 days. Can anyone help point me in the right direction? Many thanks in advance.

Upvotes: 2

Views: 91

Answers (1)

chridam
chridam

Reputation: 103305

Firstly, the $sum operator will ignore non-numeric values and the productsInOrder.price subdocument field is of String type so it would be best if you convert this to a numeric field.

Having done that, to output the total price per day for the last 7 days, change the group by key to use the $dayOfMonth operator which groups your documents per day within that 7 day range, as in the following

Orders.aggregate([
    { "$match": { "createdAt": { "$gt": pastDate } } },
    { "$unwind": "$productsInOrder" },
    {
        "$group": {
            "_id": {
                "day": { "$dayOfMonth": "$createdAt" }
            },
            "price": { "$sum": "$productsInOrder.price" }
        }
    }    
]);

Upvotes: 1

Related Questions