Skip to content
Advertisement

Mongodb aggregate group by day (php)

I have a collection with documents that look like this:

{
    _id: ObjectId("516eb5d2ef4501a804000000"),
    accountCreated: "2013-04-17 16:46",
    accountLevel: 0,
    responderCount: 0
}

I want to group and count these documents based on the accountCreated date (count per day), but I am stuck with the handling of dates since the date includes time as well. This is what I have, but it returns the count including the time, witch means lots of entries always with 1 as accounts.

$g = $form->mCollectionUsers->aggregate(array(
    array( '$group' => array( '_id' => '$accountCreated', 'accounts' => array( '$sum' => 1 ) ) )
));

Is there a way to rewrite the date to only take day in account and skip the time?

I have found this example but I canĀ“t really get figure out how to adapt it to this example.

Advertisement

Answer

If accountCreated is a date you can do it like this (I’ll use the mongo shell syntax since I’m not familiar with the php driver):

db.mCollectionUsers.aggregate([
    {$project :{
        day : {"$dayOfMonth" : "$accountCreated"},
        month : {"$month" : "$accountCreated"},
        year : {"$year" : "$accountCreated"}
    }},
    {$group: {
        _id : {year : "$year", month : "$month", day : "$day"},
        accounts : { "$sum" : 1}
    }}
]);
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement