話不多說葱色,直接先上代碼:
// StatGameActive 游戲活躍人數(shù)
func StatGameActive(start, end int64, gameID string) map[string]int {
type resp struct {
Date string `bson:"date"`
Count int `bson:"count"`
}
var (
m career.GameLoginLog
data []resp
rs = make(map[string]int)
)
where := bson.M{"created_at": bson.M{"$gte": start, "$lte": end}, "game_id": gameID}
dateBson := bson.M{"$dateToString": bson.M{"format": "%Y-%m-%d", "date": bson.M{"$toDate": bson.M{"$add": bson.A{ 28800000, bson.M{"$multiply": bson.A{"$created_at", 1000}} } } }}}
pipe:= []bson.M{
{"$match": where},
{"$project": bson.M{"date": dateBson, "user_id": 1} },
{"$group": bson.M{"_id":bson.M{"date": "$date", "user": "$user_id"}}},
{"$group": bson.M{"_id": "$_id.date", "count": bson.M{"$sum": 1}}},
{"$project": bson.M{"date": "$_id","count":1, "_id": 0}},
}
_ = mongo.Collection(m).AggregateWithError(pipe, &data)
for _, v := range data {
rs[v.Date] = v.Count
}
return rs
}
關(guān)鍵內(nèi)容在:bson.M{"$toDate": bson.M{"$add": bson.A{ 28800000, bson.M{"$multiply": bson.A{"$created_at", 1000}} } }
;
$created_at
:數(shù)據(jù)庫字段忘晤,這兒存的是秒赃绊,故將其轉(zhuǎn)為毫秒囱井。
$add
:接收一個slice,值為:date
或者 數(shù)字话原,意思為將 數(shù)據(jù)相加;28800000:東八區(qū)毫秒數(shù)。
$toDate
: 將時間戳轉(zhuǎn)為 mongo的 date類型或南,需要注意的是:這里的時間戳必須以毫秒進行。
另外:
管道是個好東西艾君,需要靈活使用采够。其主題思想類似 水流,一層一層將數(shù)據(jù)處理后傳遞到下一層進行處理冰垄;所以在使用的時候不要局限在一定要將同一類型的語句寫在同一個當(dāng)中蹬癌。類似此處
$group
、$project
.