golang访问mongodb - Go语言中文社区

golang访问mongodb


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 mongo
Using default tag: latest
latest: Pulling from library/mongo
d13d02fa248d: Pull complete
bc8e2652ce92: Pull complete
3cc856886986: Pull complete
c319e9ec4517: Pull complete
b4cbf8808f94: Pull complete
cb98a53e6676: Pull complete
f0485050cd8a: Pull complete
ac36cdc414b3: Pull complete
61814e3c487b: Pull complete
523a9f1da6b9: Pull complete
3b4beaef77a2: Pull complete
Digest: sha256:2c55bcc870c269771aeade05fc3dd3657800540e0a48755876a1dc70db1e76d9
Status: Downloaded newer image for mongo:latest

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

$ docker run --name my-mongo -p 27017:27017 -d mongo:latest --auth
14ba862fb9f6a4f4b9c965a9772c6815a4a0c9dcc3f1a9d4a9784fc705d6781d

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

$ docker exec -it 14ba862fb9f6 /bin/bash
root@14ba862fb9f6:/# mongo

2)增加一个用户

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

4、用mongo客户端测试链接
测试mongo链接

测试golang访问mongodb

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

package main

import (
        "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 main

import (
    "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一样。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_38132420/article/details/78478464
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 20:39:21
  • 阅读 ( 1299 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢