user602525
user602525

Reputation: 3264

Counting user activity with MongoDB Aggregate Framework

I will try to keep this simple. I have user objects, inside my user objects I have a field that is an array which just contains ISODates of the the days a user has logged in. I would like to count how many users logged in on a particular date for all dates that exist.

Sample user:

{
  "_id": "some_id",
  "name": "bob",
  "logins": [isodate, isodate, isodate...],

  //...
 }

I'd like an output that tells me something like:

{
  "date": ISODate,
  "number_of_users_logged_in": 10
}

Is this possible? How would I go about doing it?

Upvotes: 0

Views: 157

Answers (1)

Miguel Cartagena
Miguel Cartagena

Reputation: 2606

You need to use $unwind operation explode array, then $group by date (using the granularity that you want) and $project only the date and count, as below:

db.user.aggregate({
    $unwind: "$logins"
},
{
    $group: {
        _id: {
            year: {
                $year: "$logins"
            },
            month: {
                $month: "$logins"
            },
            day: {
                $dayOfMonth: "$logins"
            },
            hour: {
                $hour: "$logins"
            }
        },
        date: {
            $first: "$logins"
        },
        count: {
            $sum: 1
        }
    }
},
{
    $project: {
        _id : 0,
        date: "$date",
        number_of_users_logged_in: "$count"
    }
})

I grouped by year/month/day/hour.

Upvotes: 1

Related Questions