
本文详解 mongodb 在 go 生态中的驱动发展史,重点介绍已停止维护的 mgo 库及其替代方案——mongodb 官方维护的 go-driver,并提供初始化连接、基础 crud 操作的完整示例与关键注意事项。
本文详解 mongodb 在 go 生态中的驱动发展史,重点介绍已停止维护的 mgo 库及其替代方案——mongodb 官方维护的 go-driver,并提供初始化连接、基础 crud 操作的完整示例与关键注意事项。
MongoDB 官方自 2017 年起正式推出并持续维护 Go 语言原生驱动(mongo-go-driver),取代了早期广为使用的社区驱动 mgo。虽然 mgo(由 Canonical 工程师 Gustavo Niemeyer 主导开发)曾被 MongoDB 官方文档列为社区支持驱动,并在 v3.4 时代仍被部分项目采用,但其最后活跃更新停留在 2016 年末,且自 2018 年起已明确归档(archived)并停止维护,不再兼容 MongoDB 4.0+ 的新特性(如会话、事务、SCRAM-SHA-256 认证等),也不支持 Go module。
✅ 推荐使用官方驱动:
go mod init example.com/mongo-app go get go.mongodb.org/mongo-driver/mongo go get go.mongodb.org/mongo-driver/mongo/options go get go.mongodb.org/mongo-driver/bson
以下是一个标准连接与查询示例:
package main
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/bson"
)
func main() {
// 设置连接超时与上下文
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// 连接字符串(支持 SRV、带认证等格式)
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
defer func() {
if err = client.Disconnect(ctx); err != nil {
log.Fatal(err)
}
}()
// 获取数据库与集合
collection := client.Database("testdb").Collection("users")
// 插入一条文档
res, err := collection.InsertOne(ctx, bson.M{"name": "Alice", "age": 30})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Inserted ID: %v\n", res.InsertedID)
// 查询
var result bson.M
err = collection.FindOne(ctx, bson.M{"name": "Alice"}).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found: %+v\n", result)
}
⚠️ 关键注意事项:
-
绝不使用
mgo新项目:无安全更新、不兼容现代 MongoDB 版本与 Go 1.16+ module 机制; -
连接必须显式关闭:
client.Disconnect()需在defer或cleanup中调用,避免资源泄漏; -
始终使用
context控制超时与取消:防止阻塞 goroutine; -
BSON 处理推荐使用
bson.M/bson.D或结构体 +bson:"field"tag,避免手动序列化错误; - 官方驱动全面支持 MongoDB 4.0+ 分布式事务、Change Streams、客户端加密(CSFLE)等高级特性。
综上,无论新项目启动还是旧项目迁移,均应统一采用 go.mongodb.org/mongo-driver/mongo —— 它是当前唯一获得 MongoDB Inc. 官方长期支持、文档完善、测试充分且持续迭代的 Go 驱动。











