golang访问mongodb

来源:互联网 时间:2017-11-16

redis、mongodb是最近几年比较兴起的nosql,nosql的意思是not just sql。最近听到一位mongodb的专家说,为什么最近非关系型数据库会火起来,主要是由于现在的存储成本较低了,关系型数据库的产生主要是以前存储成本比较高,在存储的时候需要死扣字段以做到存储效率最大化。大多数应用中,加上很多复杂的关系,还不如直接全量的存储。比如图片、视频、文章等,可以直接存入数据库即可。

golang访问mongobd可以使用mgo。其中:
官方网站:mgo官网
文档地址:API接口文档
按照驱动命令:

go get labix.org/v2/mgo

**

安装、配置mongodb*

*
笔者使用docker容器拉一个mongodb的镜像,可以省去很多按照、配置的步骤。
1、拉取一个mongodb的镜像。

$ docker pull mongoUsing default tag: latestlatest: Pulling from library/mongod13d02fa248d: Pull completebc8e2652ce92: Pull complete3cc856886986: Pull completec319e9ec4517: Pull completeb4cbf8808f94: Pull completecb98a53e6676: Pull completef0485050cd8a: Pull completeac36cdc414b3: Pull complete61814e3c487b: Pull complete523a9f1da6b9: Pull complete3b4beaef77a2: Pull completeDigest: sha256:2c55bcc870c269771aeade05fc3dd3657800540e0a48755876a1dc70db1e76d9Status: Downloaded newer image for mongo:latest

2、启动mongodb容器
由于这边只是做演示,就不配置容器的存储了。

$ docker run --name my-mongo -p 27017:27017 -d mongo:latest --auth14ba862fb9f6a4f4b9c965a9772c6815a4a0c9dcc3f1a9d4a9784fc705d6781d

3、为用户访问增加用户
1)进入容器,打开数据库

$ docker exec -it 14ba862fb9f6 /bin/[email protected]:/# mongo

2)增加一个用户

> use adminswitched to db admin> db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})Successfully added user: { "user" : "root", "roles" : [ { "role" : "root", "db" : "admin" } ]}> quitfunction quit() { [native code]}> exit

4、用mongo客户端测试链接

测试golang访问mongodb

当本地可以用客户端链接上docker上的mongodb后说明数据库和网络没有问题。
官网上的例子如下:

package mainimport ( "fmt" "log" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson")type Person struct { Name string Phone 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) 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) if err != nil { log.Fatal(err) } fmt.Println("Phone:", result.Phone)}

修改链接url后,测试的时候会发现用户认证不了。加上对应的验证后代码如下:

package mainimport ( "fmt" "log" "time" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson")type Person struct { Name string Phone string}func main() { fmt.Println("hello world") dialInfo := &mgo.DialInfo{ Addrs: []string{"192.168.99.100"}, Direct: false, Timeout: time.Second * 1, Database: "admin", Source: "admin", Username: "root", Password: "root", PoolLimit: 4096, // Session.SetPoolLimit } session, err := mgo.DialWithInfo(dialInfo) if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) c := session.DB("admin").C("test") 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) if err != nil { log.Fatal(err) } fmt.Println("Phone:", result.Phone)}

输出结果:
Phone: +55 53 8116 9639
说明已经验证成功,并且可以插入读取了。
到数据库中查看插入内容:

后续将把mgo的API列举熟悉下,类似golang访问redis一样。

相关阅读:
Top