golang访问mongodb

本文介绍了如何使用golang的mgo驱动访问mongodb。首先讲述了nosql数据库如mongodb兴起的原因,接着通过docker快速搭建mongodb环境,并创建用户进行权限设置。然后通过mgo驱动建立golang到mongodb的连接,展示了一段包含用户认证的示例代码,成功实现了数据的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值