分享
  1. 首页
  2. 文章

谈谈一些关于mgo的用法

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

前言

最近在项目中使用mongodb进行简单的数据分析,在使用mongodb驱动mgo时遇到一些问题,比如在mongodb中执行命令成功,到了mgo中就执行失败。在这里谈一谈实践过程中遇到的问题,基础的用法不再说明了,可以自行百度。

使用

查找(Find)

这个估计是mongodb里用的最多的了吧,mgo中使用Find(query interface{}),query参数一般传入[]bson.M。下面给个例子:

m := bson.M{
 "CurTimestamp": bson.M{
 "$gte": start,
 "$lte": end,
 },
 "Account": account,
 "ToNodeType": "cloud",
 }
 session.DB("db").C("collect").Find(m).Count()

这里查找时间戳内,账号为account,节点类型为cloud的数据并统计个数。

聚合管道(Aggregation Pipeline)

聚合管道在mgo中为Pipe(pipeline interface{}) ,这个和bash中使用的管道很像,数据可以被层层处理。一般传入的参数为[]bson.M。这个[]bson.M里如果还有嵌套则还要使用[]bson.M(刚开始使用就被坑了一下)。比如这里首先匹配节点类型和账号,时间戳在一段时间内,然后根据名字分组统计数量,最后排序取最前面的三个。

 //这个就可以传入Pipe
 m := []bson.M{
 {"$match": bson.M{"NodeType": "cloud", "Account": account, "CurTimestamp": bson.M{"$gte": start, "$lte": end}}},
 {"$group": bson.M{"_id": "$TagName", "count": bson.M{"$sum": 1}}},
 {"$sort": bson.M{"count": -1}},
 {"$limit": 3},
 }
 //这里就可以取到输出的数据
 var values []result
 session.DB("db").C("collect").Pipe(m).All(&values)

数据是一层一层过滤下来的。当然mongodb中的聚合命令不止这些,用法大同小异

MapReduce

如果要实现一些高级功能,mongodb的基本命令满足不了你,可能就要使用这个了。mongodb中要实现MapReduce就要实现Map函数和Reduce函数,Map函数调用emit将key和value传给Reduce函数处理。这里给的例子首先计时间戳在哪个时间范围内,然后累加这个值,js不是很精通,写的不好请见谅。

m := new(mgo.MapReduce)
 m.Map = `function() { var date = new Date();
 date.setTime(this.CurTimestamp / 1000);
 var hour = date.getHours();
 if((hour >= 6) && (hour <= 11)) {
 result.morning++;
 }else if((hour >= 12) && (hour <= 18)){
 result.afternoon ++;
 }else if((hour >= 19) && (hour <= 23)) {
 result.night ++;
 }else{
 result.am ++;
 }
 emit(this.Account, {});}`
 m.Reduce = `function() {return result;}`
 m.Scope = bson.M{
 "result": bson.M{
 "morning": 0,
 "afternoon": 0,
 "night": 0,
 "am": 0,
 },
 }
 var value []timeResult
 session.DB("db").C("collect").Find().MapReduce(m, &value)

这里的map函数负责计算时间戳范围,result是引入的外部变量。这里就可以计算出这个账号产生数据的时间范围统计。

结语

其实用多了以后就基本能熟练使用了,重要还是了解mogodb命令的使用。


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

本文来自:Segmentfault

感谢作者:pinecone

查看原文:谈谈一些关于mgo的用法

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏