/* 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
]
]
]);