用Golang和mongodb交互之连接mongodb数据库

2020-02-26linuxmongodb

引入依赖包

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)
}
Last Updated 8/21/2026, 3:57:15 AM