golang mgo 使用
golang使用mongodb,目前比较多人用的是mgo(pronounced as mango)
github地址
官网
文档
直接上官方example的代码
Example
首先是要获得模块
go get gopkg.in/mgo.v2
下一步(这里假设你已经会搭建go的环境和了解go的库配置)
package mainimport ("fmt""log""gopkg.in/mgo.v2""gopkg.in/mgo.v2/bson"
)type Person struct {Name stringPhone string
}func main() {session, err := mgo.Dial("server1.example.com,server2.example.com")//传入数据库的地址,可以传入多个,具体请看接口文档 if err != nil {panic(err)}defer session.Close() //用完记得关闭// Optional. Switch the session to a monotonic behavior.session.SetMode(mgo.Monotonic, true) //读模式,与副本集有关,详情参考https://docs.mongodb.com/manual/reference/read-preference/ & https://docs.mongodb.com/manual/replication/c := session.DB("test").C("people")err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},&Person{"Cla", "+55 53 8402 8510"})if err != nil {log.Fatal(err)}result := Person{}err = c.Find(bson.M{"name": "Ale"}).One(&result) //如果查询失败,返回“not found”if err != nil {log.Fatal(err)}fmt.Println("Phone:", result.Phone)
}
Dial函数,参考https://godoc.org/gopkg.in/mgo.v2#Dial
传入参数的格式:
- [mongodb://][user:pass@]host1[:port1][,host2[:port2],…][/database][?options]
例如
- “mongodb://admin:123456@localhost:27017/admin” //如果mongodb打开了auth功能,必须传入账号密码才可以访问
实际应用
例子是在main函数直接dial,不过很多时候我们想在其它模块里面使用,尤其是在goruntime(有时候被称作协程)使用,这就需要稍微改造一下。
高并发环境里面,不可能每次使用前dial,因为重新建立tcp连接是一件十分耗时的操作。
一般来说,会使用连接池。一般连接池的设计,有两个很重要的参数,Max Active数量和Max Idle数量,max active意思是最多可以建立多少连接,max idle就是在空闲的时候保持的连接数量,方便随时调用,可以避免重新与数据库建立连接。
mgo内部已经做了连接池的机制,默认的连接池大小是4096,注意应该在初始化的时候设置好连接池的数量
以下给出一个demo
mongodb.go 详细内容
package mongodbimport ("gopkg.in/mgo.v2""time"
)//global
var GlobalMgoSession *mgo.Sessionfunc init() {globalMgoSession, err := mgo.DialWithTimeout("mongodb://admin:123456@localhost:27017/admin", 10 * time.Second)if err != nil {panic(err)}GlobalMgoSession=globalMgoSessionGlobalMgoSession.SetMode(mgo.Monotonic, true)//default is 4096GlobalMgoSession.SetPoolLimit(300)
}func CloneSession() *mgo.Session {return GlobalMgoSession.Clone()
}
接着test
mongodb_test.go
package mongodb_testimport ("fmt""×××/db/mongodb" //这里要改成mongodb.go的文件存放路径"gopkg.in/mgo.v2/bson""time""testing"
)type User struct {Id_ bson.ObjectId `bson:"_id"`Name string `bson:"name"`Age int `bson:"age"`JoinedAt time.Time `bson:"joned_at"`Interests []string `bson:"interests"`
}func TestMongodb(t *testing.T) {session := mongodb.CloneSession()//调用这个获得sessiondefer session.Close() //一定要记得释放c := session.DB("test1").C("people")err := c.Insert(&User{Id_: bson.NewObjectId(),Name: "Jimmy Kuu",Age: 33,JoinedAt: time.Now(),Interests: []string{"Develop", "Movie"} })if err != nil {panic(err)}var users []Usererr=c.Find(nil).Limit(5).All(&users)if err != nil {panic(err)}fmt.Println(users)}
连接池我设成了500,这里可以根据个人需求自己选择,也可以使用默认设置。
强调一下,一定要记得调用 defer session.Close() ,连接池里面会复用释放掉的连接的。
其实这里的单元测试不是很正规,不方便做成功的判断。。可以test -v,直接看控制台的输出。
关于mgo连接池的复用
下面给出Clone方法的注释
// Clone works just like Copy, but also reuses the same socket as the original
// session, in case it had already reserved one due to its consistency
// guarantees. This behavior ensures that writes performed in the old session
// are necessarily observed when using the new session, as long as it was a
// strong or monotonic session. That said, it also means that long operations
// may cause other goroutines using the original session to wait.
func (s *Session) Clone() *Session {s.m.Lock()scopy := copySession(s, true)s.m.Unlock()return scopy
}
相关参考文档
https://my.oschina.net/ffs/blog/300148
http://www.cnblogs.com/shenguanpu/p/5318727.html
golang mgo 使用相关推荐
- Golang mgo 剖析之 Session
golang 操作 mongodb 使用的包是 "gopkg.in/mgo.v2",coding 过程中需要并发读写 mongodb 数据库,简单观摩了下源码,记录下自己的一些理解 ...
- golang常用库之-mgo.v2包、MongoDB官方go-mongo-driver包、七牛Qmgo包 | go操作mongodb、mongodb bson
文章目录 golang常用库之-mgo.v2包.MongoDB官方go-mongo-driver包.七牛Qmgo包 | go操作mongodb.mongodb bson 一.[不推荐]mgo.v2包 ...
- Golang 的 mgo 连接池
mgo 的 Session 与连接池 简介 mgo 是由 Golang 编写的开源 mongodb 驱动.由于 mongodb 官方并没有开发 Golang 驱动,因此这款驱动被广泛使用.mongod ...
- Golang使用mgo.v2包操作MongoDB的基础示例
golang对MongoDB的操作使用gopkg.in/mgo.v2库操作.如下是基本的一些用法 连接 package main import ( "log" "time ...
- golang mongodb驱动mgo异常崩溃问题
原文链接:石匠的Blog 背景 在我的后端游戏架构中,有一个golang开发的数据服务器dataserver,用来存储落地玩家的历史数据,并提供给客户端http接口查询.由于之前的项目已经在使用mon ...
- Go实战--golang中使用echo框架、MongoDB、JWT搭建REST API(labstack/echo、gopkg.in/mgo.v2、dgrijalva/jwt-go)
生命不止,继续go go go !!! 之前介绍过golang中restful api的博客,是使用redis作为持久化,httprouter作为框架: Go实战–通过httprouter和redis ...
- golang的mongodb操作(mgo)
2019独角兽企业重金招聘Python工程师标准>>> 使用mgo http://godoc.org/labix.org/v2/mgo package mainimport (&qu ...
- golang使用mongoDB - mgo.v2
下面是我的模块代码 你可以go get github.com/yihubaikai/gopublic/mongo 里面下载 package mongo import ( "fmt&q ...
- Go实战--golang中使用MongoDB(mgo)
生命不止,继续 go go go !!! 昨天分享了golang如何操作redis数据库,那今天就介绍一下golang中如何使用mongodb数据库. 何为MongoDB? 简介 MongoDB 是由 ...
最新文章
- linux对磁盘进行分区,Linux的安装过程中,可以实现对磁盘进行分区。
- Java线程的生命周期及线程的几种状态
- 【NLP】XLnet:GPT和BERT的合体,博采众长,所以更强
- Linux学习日记:第二天
- winScp中文乱码设置
- 100个数学家如何集体越狱??
- mysql数据库标识符大小写_SQL语法区分大小写吗?
- 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
- .NET设计模式(9):桥接模式(Bridge Pattern)(转)
- 如何用ps扣字体_PS如何抠文字 Photoshop抠字教程
- android 主流应用,android应用推广系列(一):国内几个google主流应用市场介绍
- FileSplit cannot be cast Exception
- Java 设置Word文本框中的文字旋转方向
- 如何从被领导到领导别人
- 小米计算机科学计算机,小米计算器APP发布“亲戚计算”功能
- apk系统签名小技巧
- Android 6.0(棉花糖)新特性
- 从第三季“多多读书月”看拼多多的知识普惠进阶
- 微商软文标题怎么写才吸引人?
- skt7850鸿蒙策略,s5总决赛小组赛:SKT不败战绩晋级八强
热门文章
- 2022年全网最新 Windows10 安装 JDK1.8
- IT加油站课程调价通告
- AMD首款5纳米PC处理器锐龙7000亮相,频率首破5GHz大关,单核性能提升15%
- Cassini Data Rev manufacturer eals Likely Subsurface Ocean on Titan
- python文献翻译_英文学术文献翻译软件有哪些推荐?
- 千年私服服务器用户名创建,千年私服详细安装技术文章
- 2023年全国最新二级建造师精选真题及答案52
- 好用的chrome的插件
- mysql_affect_array_Mysql代理类 支持Master/Slave 读写分离
- 曾国藩不间断读书做笔记 读书十年始展拳脚