I have a collection of products with the following documents:
{ "_id" : 1, "item" : "abc", created: ISODate("2014-10-01T08:12:00Z") } { "_id" : 2, "item" : "jkl", created: ISODate("2014-10-02T09:13:00Z") } { "_id" : 3, "item" : "hjk", created: ISODate("2014-10-02T09:18:00Z") } { "_id" : 4, "item" : "sdf", created: ISODate("2014-10-07T09:14:00Z") } { "_id" : 5, "item" : "xyz", created: ISODate("2014-10-15T09:15:00Z") } { "_id" : 6, "item" : "iop", created: ISODate("2014-10-16T09:15:00Z") }
I want to draw a graph that describes the number of products per day, so I use the mongodb aggregation structure to calculate the product group by day:
var proj1 = { "$project": { "created": 1, "_id": 0, "h": {"$hour": "$created"}, "m": {"$minute": "$created"}, "s": {"$second": "$created"}, "ml": {"$millisecond": "$created"} } }; var proj2 = { "$project": { "created": { "$subtract": [ "$created", { "$add": [ "$ml", {"$multiply": ["$s", 1000]}, {"$multiply": ["$m", 60, 1000]}, {"$multiply": ["$h", 60, 60, 1000]} ] }] } } }; db.product.aggregate([ proj1, proj2, {$group: { _id: "$created", count: {$sum: 1} }}, {$sort: {_id: 1}} ])
Result in mongo shell:
{ "result" : [ { "_id" : ISODate("2014-10-01T00:00:00.000Z"), "count" : 1 }, { "_id" : ISODate("2014-10-02T00:00:00.000Z"), "count" : 2 }, { "_id" : ISODate("2014-10-07T00:00:00.000Z"), "count" : 1 }, { "_id" : ISODate("2014-10-15T00:00:00.000Z"), "count" : 1 }, { "_id" : ISODate("2014-10-16T00:00:00.000Z"), "count" : 1 } ], "ok" : 1 }
Of course, for several days there is no product, and the diagram using the above result looks like this:

But the desired chart should look like this:

So the question is: How to add missing days (for example, from the last 30 days) to the result set using count = 0 ? . This means that the desired result set should look like this: this:
{ "result" : [ { "_id" : ISODate("2014-09-16T00:00:00.000Z"), "count" : 0 }, { "_id" : ISODate("2014-09-17T00:00:00.000Z"), "count" : 0 }, ... { "_id" : ISODate("2014-10-01T00:00:00.000Z"), "count" : 1 }, { "_id" : ISODate("2014-10-02T00:00:00.000Z"), "count" : 2 }, { "_id" : ISODate("2014-10-03T00:00:00.000Z"), "count" : 0 }, ... { "_id" : ISODate("2014-10-07T00:00:00.000Z"), "count" : 1 }, { "_id" : ISODate("2014-09-08T00:00:00.000Z"), "count" : 0 }, ... { "_id" : ISODate("2014-10-15T00:00:00.000Z"), "count" : 1 }, { "_id" : ISODate("2014-10-16T00:00:00.000Z"), "count" : 1 }, // also, add some extra days { "_id" : ISODate("2014-10-17T00:00:00.000Z"), "count" : 0 }, { "_id" : ISODate("2014-10-10T00:00:00.000Z"), "count" : 0 } ], "ok" : 1 }