golang访问mongodb

来源:互联网 发布:雷蛇淘宝假的 编辑:程序博客网 时间:2024/06/05 22:59

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/bashroot@14ba862fb9f6:/# 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客户端测试链接
测试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一样。