golang 中mongodb利用时间戳进行分组统计

diamonds_A · · 1892 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

话不多说,直接先上代码:

// StatGameActive 游戏活跃人数
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
}

关键内容在:bson.M{"$toDate": bson.M{"$add": bson.A{ 28800000, bson.M{"$multiply": bson.A{"$created_at", 1000}} } } ;
$created_at:数据库字段,这儿存的是秒,故将其转为毫秒。
$add:接收一个slice,值为:date 或者 数字,意思为将 数据相加;28800000:东八区毫秒数。
$toDate: 将时间戳转为 mongo的 date类型,需要注意的是:这里的时间戳必须以毫秒进行

另外:

管道是个好东西,需要灵活使用。其主题思想类似 水流,一层一层将数据处理后传递到下一层进行处理;所以在使用的时候不要局限在一定要将同一类型的语句写在同一个当中。类似此处$group$project.


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:diamonds_A

查看原文:golang 中mongodb利用时间戳进行分组统计

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1892 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传