🚀 使用 Go 连接 MongoDB:一场宇宙级的数据冒险
想象一下,你的Go程序就像一艘宇宙飞船,而MongoDB则是那遥远星系中的神秘星球。今天,我们将学习如何让这艘飞船平稳降落在MongoDB上,并开启一段数据探索之旅!
📦 首先,准备你的装备 —— 定义配置结构体
type Config struct {
// MongoDB URI 示例:"mongodb://localhost:27017"
URI string `json:"uri" yaml:"uri"`
UserName string `json:"username" yaml:"username"`
Password string `json:"password" yaml:"password"`
Database string `json:"database" yaml:"database"`
// 副本集名称(启动时指定的--replSet值,如rs0)
ReplicaSetName string `json:"replicaSetName" yaml:"replicaSetName"`
MaxPoolSize uint64 `json:"maxPoolSize" yaml:"maxPoolSize"`
MinPoolSize uint64 `json:"minPoolSize" yaml:"minPoolSize"`
MaxConnIdleTime time.Duration `json:"maxConnIdleTime" yaml:"maxConnIdleTime"`
}
这段代码定义了一个Config结构体,它就像是你的宇宙飞船的操作手册,包含了所有必要的参数来连接MongoDB。
🛠 初始化连接函数 —— 准备起飞
import (
"common/logger"
"context"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
const (
defaultMaxPoolSize uint64 = 20
defaultMinPoolSize uint64 = 5
defaultMaxConnIdleTime time.Duration = 5 * time.Minute
)
func Init(cfg Config) *mongo.Client {
clientOptions := options.Client()
uri := cfg.URI
if cfg.ReplicaSetName != "" {
uri += "?replicaSet=" + cfg.ReplicaSetName
} else {
mode, _ := readpref.New(readpref.PrimaryMode)
clientOptions.SetReadPreference(mode)
}
clientOptions.ApplyURI(uri).
SetMaxPoolSize(cfg.MaxPoolSize).
SetMinPoolSize(cfg.MinPoolSize).
SetMaxConnIdleTime(cfg.MaxConnIdleTime)
if cfg.MaxPoolSize == 0 {
clientOptions.SetMaxPoolSize(defaultMaxPoolSize)
}
if cfg.MinPoolSize == 0 {
clientOptions.SetMinPoolSize(defaultMinPoolSize)
}
if cfg.MaxConnIdleTime == 0 {
clientOptions.SetMaxConnIdleTime(defaultMaxConnIdleTime)
}
if cfg.UserName != "" || cfg.Password != "" {
credential := options.Credential{
Username: cfg.UserName,
Password: cfg.Password,
}
if cfg.Database != "" {
credential.AuthSource = cfg.Database
}
clientOptions.SetAuth(credential)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Connect to MongoDB
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
panic(err)
}
// Ping the database to verify connection
if err = client.Ping(ctx, nil); err != nil {
panic(err)
}
logger.Info("Connected to MongoDB!")
return client
}
哇哦!这段代码看起来像是一段复杂的太空指令,但实际上非常直观。
首先,我们设置了客户端选项,然后根据配置添加了副本集信息(如果有的话)。接下来,我们设置最大连接池大小、最小连接池大小和最大空闲时间等参数。最后,我们尝试连接并验证连接是否成功。如果一切顺利,你就会看到“Connected to MongoDB!”的日志消息,这意味着你的飞船已经安全着陆在MongoDB星球上了!
💡 小贴士
- 确保你的MongoDB实例正在运行,并且可以通过提供的URI访问。
- 如果你使用的是副本集,请不要忘记设置
ReplicaSetName字段。 - 默认的最大连接池大小为20,最小连接池大小为5,最大空闲时间为5分钟。你可以根据需要调整这些值。
- 记得处理错误,避免在生产环境中直接调用
panic。
🎉 恭喜你完成了这次宇宙探险!现在,你可以开始探索MongoDB中存储的数据宝藏了。祝你好运,程序员宇航员! 🚀