用Golang和mongodb交互之连接mongodb数据库
引入依赖包
Go连接mongodb需要依赖go.mongodb.org/mongo-driver/mongo这个包
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
新建登陆账户
- 登陆mongodb服务器,新建用户,授权其可以读写test数据库中的所有集合
db.createUser({
user:"test",
pwd:"123456",
roles:["readWrite"]})
- 启用mongodb登陆认证
docker run --name mongo -p 27017:27017 -v /data/mongodb/:/data/db -v /etc/localtime:/etc/localtime -d mongo mongod --auth
用Go 开启验证连接mongodb单节点
credential := options.Credential{
Username: "test",
Password: "123456",
AuthSource: "test",
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
clientOpts := options.Client().ApplyURI("mongodb://127.0.0.1:27017?connect=direct").SetAuth(credential)
client, err := mongo.Connect(ctx, clientOpts)
if err != nil {
panic(err)
}
if err = client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
defer client.Disconnect(ctx)
}
其中:
| 字段 | 含义 |
|---|---|
| Username | 用户名 |
| Password | 密码 |
| AuthSource | 授权数据库 |
如果登陆失败,会爆出panice,程序异常退出
panic: connection() : auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
如果程序10秒内没有连接到mongod服务端,会爆出panice,程序异常退出
panic: context deadline exceeded
免密Go登陆mongodb单节点
当日常测试的时候,可以不验证用户名和密码登陆mongodb服务器。
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
clientOpts := options.Client().ApplyURI("mongodb://127.0.0.1:27017?connect=direct")
client, err := mongo.Connect(ctx, clientOpts)
if err != nil {
panic(err)
}
if err = client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
defer client.Disconnect(ctx)
}
如果程序10秒内没有连接到mongod服务端,会爆出panice,程序异常退出
panic: context deadline exceeded
免密Go登陆mongodb复制集
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
clientOpts := options.Client().ApplyURI("mongodb://192.168.4.2:27017/?replicaSet=replset")
client, err := mongo.Connect(ctx, clientOpts)
if err != nil {
panic(err)
}
if err = client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
defer client.Disconnect(ctx)
}