摘要:在这里谈一谈实践过程中遇到的问题,基础的用法不再说明了,可以自行百度。一般传入的参数为。当然中的聚合命令不止这些,用法大同小异如果要实现一些高级功能,的基本命令满足不了你,可能就要使用这个了。
前言
最近在项目中使用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命令的使用。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19004.html
摘要:准备数据结构这个以对一个简单的通讯录进行插入查询更新删除记录为例,中包含和两个字段下载还没出官方的驱动包,是现在比较流行的第三方包,能找到的相关资料也比较多。准备实现对的增删改查操作,先想了下怎么写测试案例。查找,通过查找该条记录。 环境声明:go version go1.11MongoDB server version 4.0.3 背景 这是我第一次接触golang和MongoDB,...
摘要:没有类这一概念,对于变量的捆绑都是由键值对形式的结构体实现的。在做记录的查询时,需要新建一个同类型的结构体或结构体数组,然后执行操作,如果参数为空,则返回全部记录如果你熟悉的操作,可以看出,这样的操作与直接在内操作几乎相同。 go没有类这一概念,对于变量的捆绑都是由键值对形式的结构体(struct)实现的。这对同样是以键值对形式存储的mongodb以及json都非常友好。所以在go中,...
摘要:如果删除所有用替换其他写了一个和结合的数据查询服务细节可点击链接到查看 1.系统环境 Golang:go version go1.10.3 darwin/amd64 OS:MacOS MongoDB: version: 3.4.4 2.Golang使用MongoDB 使用:gopkg.in/mgo.v2 获取包:go get gopkg.in/mgo.v2 引入:impor...
摘要:搭建服务器采用搭建,可参考读模式的读模式共有五种在主节点上进行所有的读操作优先在主节点上进行读操作,如果主节点不可用,再从从节点操作。 Replica Sets搭建 服务器采用Replica Sets搭建,可参考Deploy a Replica Set 读模式 Mongod的读模式共有五种: primary. 在主节点上进行所有的读操作 primaryPreferred. 优...
摘要:工作中偶尔会根据字符串字段的长度来筛选一些数据,这时候可能会用到正则表达式,也可以用的,正则表达式在不同的语言中,正确写法又有所差异,特此记录一下。 工作中偶尔会根据字符串字段的长度来筛选一些数据,这时候可能会用到正则表达式,也可以用mongodb的$where,正则表达式在不同的语言中,正确写法又有所差异,特此记录一下。 假如查找comment字段字符串长度大于10的数据,mon...
阅读 2032·2021-11-11 16:55
阅读 1376·2021-09-28 09:36
阅读 1023·2019-08-29 15:21
阅读 1555·2019-08-29 14:10
阅读 2727·2019-08-29 14:08
阅读 1582·2019-08-29 12:31
阅读 3220·2019-08-29 12:31
阅读 951·2019-08-26 16:47