用 Go 语言连接 MongoDB:编程界的星际旅行

🚀 使用 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中存储的数据宝藏了。祝你好运,程序员宇航员! 🚀