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 使用相关推荐

  1. Golang mgo 剖析之 Session

    golang 操作 mongodb 使用的包是 "gopkg.in/mgo.v2",coding 过程中需要并发读写 mongodb 数据库,简单观摩了下源码,记录下自己的一些理解 ...

  2. 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包 ...

  3. Golang 的 mgo 连接池

    mgo 的 Session 与连接池 简介 mgo 是由 Golang 编写的开源 mongodb 驱动.由于 mongodb 官方并没有开发 Golang 驱动,因此这款驱动被广泛使用.mongod ...

  4. Golang使用mgo.v2包操作MongoDB的基础示例

    golang对MongoDB的操作使用gopkg.in/mgo.v2库操作.如下是基本的一些用法 连接 package main import ( "log" "time ...

  5. golang mongodb驱动mgo异常崩溃问题

    原文链接:石匠的Blog 背景 在我的后端游戏架构中,有一个golang开发的数据服务器dataserver,用来存储落地玩家的历史数据,并提供给客户端http接口查询.由于之前的项目已经在使用mon ...

  6. 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 ...

  7. golang的mongodb操作(mgo)

    2019独角兽企业重金招聘Python工程师标准>>> 使用mgo http://godoc.org/labix.org/v2/mgo package mainimport (&qu ...

  8. golang使用mongoDB - mgo.v2

    下面是我的模块代码 你可以go get github.com/yihubaikai/gopublic/mongo 里面下载 package mongo import (     "fmt&q ...

  9. Go实战--golang中使用MongoDB(mgo)

    生命不止,继续 go go go !!! 昨天分享了golang如何操作redis数据库,那今天就介绍一下golang中如何使用mongodb数据库. 何为MongoDB? 简介 MongoDB 是由 ...

最新文章

  1. linux对磁盘进行分区,Linux的安装过程中,可以实现对磁盘进行分区。
  2. Java线程的生命周期及线程的几种状态
  3. 【NLP】XLnet:GPT和BERT的合体,博采众长,所以更强
  4. Linux学习日记:第二天
  5. winScp中文乱码设置
  6. 100个数学家如何集体越狱??
  7. mysql数据库标识符大小写_SQL语法区分大小写吗?
  8. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
  9. .NET设计模式(9):桥接模式(Bridge Pattern)(转)
  10. 如何用ps扣字体_PS如何抠文字 Photoshop抠字教程
  11. android 主流应用,android应用推广系列(一):国内几个google主流应用市场介绍
  12. FileSplit cannot be cast Exception
  13. Java 设置Word文本框中的文字旋转方向
  14. 如何从被领导到领导别人
  15. 小米计算机科学计算机,小米计算器APP发布“亲戚计算”功能
  16. apk系统签名小技巧
  17. Android 6.0(棉花糖)新特性
  18. 从第三季“多多读书月”看拼多多的知识普惠进阶
  19. 微商软文标题怎么写才吸引人?
  20. skt7850鸿蒙策略,s5总决赛小组赛:SKT不败战绩晋级八强

热门文章

  1. 2022年全网最新 Windows10 安装 JDK1.8
  2. IT加油站课程调价通告
  3. AMD首款5纳米PC处理器锐龙7000亮相,频率首破5GHz大关,单核性能提升15%
  4. Cassini Data Rev manufacturer eals Likely Subsurface Ocean on Titan
  5. python文献翻译_英文学术文献翻译软件有哪些推荐?
  6. 千年私服服务器用户名创建,千年私服详细安装技术文章
  7. 2023年全国最新二级建造师精选真题及答案52
  8. 好用的chrome的插件
  9. mysql_affect_array_Mysql代理类 支持Master/Slave 读写分离
  10. 曾国藩不间断读书做笔记 读书十年始展拳脚