天天看點

Yii2 MongoDB多字段分組彙總統計

/* 1 */
{
    "_id" : ObjectId("5b3dbe4760e59d22d06ec4ae"),
    "user_id" : ObjectId("5b0657c92bb7b0325d45f566"),
    "login_date" : "2018-05-24",
    "create_time" : ISODate("2018-05-24T06:12:25.188Z")
}

/* 2 */
{
    "_id" : ObjectId("5b3dd35fe1382307183afa2c"),
    "user_id" : ObjectId("5b3dd31fe13823071a706aec"),
    "create_time" : ISODate("2018-07-05T08:14:23.725Z"),
    "login_date" : "2018-07-05"
}

/* 3 */
{
    "_id" : ObjectId("5b3dd3a4e1382307144a7fcc"),
    "user_id" : ObjectId("5b3dd31fe13823071a706aec"),
    "create_time" : ISODate("2018-07-05T08:15:32.714Z"),
    "login_date" : "2018-07-05"
}

/* 4 */
{
    "_id" : ObjectId("5b42c3249248b302b75fc262"),
    "user_id" : ObjectId("5b0657d42bb7b02e7d7d702e"),
    "create_time" : ISODate("2018-07-07T02:06:28.699Z"),
    "login_date" : "2018-07-07"
}
           

執行個體場景:統計時間範圍内的登入使用者總數,同一天同使用者多次登入隻算一次登入。

分析:首先,要對日期進行分組;然後,對同一天内的相同使用者進行去重操作;由于,在資料量大的時候無法使用distinct函數。是以,需要使用aggregate。

執行個體代碼:

$data = UserLoginLog::getCollection()->aggregate([
            [
                '$match'=>[
                    'create_time' => [ // 日期搜尋條件
                        '$gte'=>$startDate,
                        '$lt'=>$endDate
                    ]
                ]
            ],[
                '$group'=>[
                    '_id'=>['login_date'=>'$login_date', 'user_id'=>'$user_id'], //通過user_id分組去重
                    'count'=>[
                        '$sum'=>1
                    ]
                ]
            ],[
                '$group'=>[
                    '_id'=>null, //統計總資料量
                    'count'=>[
                        '$sum'=>1
                    ]
                ]
            ],[
                '$project'=>[
                    '_id'=>0, //不輸出_id字段
                    'count'=>1
                ]
            ]
        ]);