15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MongoDB の Aggregation Framework を使って PV と UU を同時に集計する

Posted at

データ

> db.userlog.find({}, {"_id": 0});
{ "user_id" : 1, "path" : "mypage", "timestamp" : ISODate("2013-06-12T15:00:00Z") }
{ "user_id" : 2, "path" : "mypage", "timestamp" : ISODate("2013-06-12T15:00:00Z") }
{ "user_id" : 3, "path" : "mypage", "timestamp" : ISODate("2013-06-12T15:00:00Z") }
{ "user_id" : 4, "path" : "mypage", "timestamp" : ISODate("2013-06-12T15:00:00Z") }
{ "user_id" : 5, "path" : "mypage", "timestamp" : ISODate("2013-06-12T15:00:00Z") }
{ "user_id" : 4, "path" : "home", "timestamp" : ISODate("2013-06-12T16:00:00Z") }
{ "user_id" : 2, "path" : "home", "timestamp" : ISODate("2013-06-12T16:00:00Z") }
{ "user_id" : 4, "path" : "home", "timestamp" : ISODate("2013-06-11T16:00:00Z") }
{ "user_id" : 1, "path" : "login", "timestamp" : ISODate("2013-06-10T16:00:00Z") }
{ "user_id" : 2, "path" : "login", "timestamp" : ISODate("2013-06-10T16:00:00Z") }
{ "user_id" : 3, "path" : "login", "timestamp" : ISODate("2013-06-11T16:00:00Z") }
{ "user_id" : 3, "path" : "login", "timestamp" : ISODate("2013-06-11T17:00:00Z") }
{ "user_id" : 3, "path" : "login", "timestamp" : ISODate("2013-06-11T18:00:00Z") }
{ "user_id" : 4, "path" : "login", "timestamp" : ISODate("2013-06-11T16:00:00Z") }
{ "user_id" : 2, "path" : "mypage", "timestamp" : ISODate("2013-06-11T15:00:00Z") }
{ "user_id" : 2, "path" : "mypage", "timestamp" : ISODate("2013-06-11T16:00:00Z") }

特定日時のPVとUUを集計

Pipeline

db.userlog.aggregate(
    {
        $match: {
            "timestamp" : {
                "$gte" : ISODate("2013-06-12T00:00:00+09:00"), 
                "$lt" : ISODate("2013-06-13T00:00:00+09:00")
            }
        }
    },
    {
        $group: {
            "_id": {
                "path": "$path",
                "user_id": "$user_id"
            },
            "count" : {
                "$sum" : 1
            }
        }
    },
    {
        $group: {
            "_id": {
                "path": "$_id.path"
            },
            "pv": {
                "$sum": "$count"
            }, 
            "uu": {
                "$sum": 1
            }
        }
    },
    {
        $project: {
            "_id": 0,
            "path": "$_id.path", 
            "pv": 1, 
            "uu": 1
        }
    }    
);

結果

{
        "result" : [
                {
                        "pv" : 1,
                        "uu" : 1,
                        "path" : "home"
                },
                {
                        "pv" : 4,
                        "uu" : 2,
                        "path" : "login"
                },
                {
                        "pv" : 2,
                        "uu" : 1,
                        "path" : "mypage"
                }
        ],
        "ok" : 1
}

日別のPVとUUを集計

但し MongoDB 2.4.4 では日付がUTCになってしまう。

[#SERVER-6310] Timezone support in date operators at query time - MongoDB

Pipeline

db.userlog.aggregate(
    {
        $group: {
            "_id": {
                "year": {
                    "$year": "$timestamp"
                },
                "month": {
                    "$month": "$timestamp"
                },
                "day": {
                    "$dayOfMonth": "$timestamp"
                },
                "path": "$path",
                "user_id": "$user_id"
            },
            "count" : {
                "$sum" : 1
            }
        }
    },
    {
        $group: {
            "_id": {
                "year": "$_id.year",
                "month": "$_id.month",
                "day": "$_id.day",
                "path": "$_id.path"
            },
            "pv": {
                "$sum": "$count"
            }, 
            "uu": {
                "$sum": 1
            }
        }
    },
    {
        $project: {
            "_id": 0,
            "year": "$_id.year", 
            "month": "$_id.month", 
            "day": "$_id.day", 
            "path": "$_id.path", 
            "pv": 1, 
            "uu": 1
        }
    }    
);

結果

{ 
        "result" : [
                {
                        "pv" : 2,
                        "uu" : 1,
                        "year" : 2013,
                        "month" : 6,
                        "day" : 11,
                        "path" : "mypage"
                },
                {
                        "pv" : 2,
                        "uu" : 2,
                        "year" : 2013,
                        "month" : 6,
                        "day" : 12,
                        "path" : "home"
                },
                {
                        "pv" : 1,
                        "uu" : 1,
                        "year" : 2013,
                        "month" : 6,
                        "day" : 11,
                        "path" : "home"
                },
                {
                        "pv" : 5,
                        "uu" : 5,
                        "year" : 2013,
                        "month" : 6,
                        "day" : 12,
                        "path" : "mypage"
                },
                {
                        "pv" : 2,
                        "uu" : 2,
                        "year" : 2013,
                        "month" : 6,
                        "day" : 10,
                        "path" : "login"
                },
                {
                        "pv" : 4,
                        "uu" : 2,
                        "year" : 2013,
                        "month" : 6,
                        "day" : 11,
                        "path" : "login"
                }
        ],
        "ok" : 1
}
15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?