Go语言MongoDB怎么增删改查_Go语言MongoDB CRUD教程【核心】
必须用 go.mongodb.org/mongo-driver/mongo;mongo.Connect 需 context.WithTimeout;插入前验证 client.Ping;URI 密码需 URL 编码;结构体字段首字母大写并加 bson tag;Find 后须 cursor.Close 且 Decode 用指针;所有操作必传 context。MongoDB 官方驱动已弃用 mgo,必须用 go.mongodb.org/mongo-driver/mongo —— 2026 年还在用 mgo 会直接连不上新版 MongoDB(≥ 5.0),且无法支持 TLS 1.3、SCRAM-SHA-256 认证等现代安全机制。怎么连上数据库?mongo.Connect 必须配 context 和超时不设超时的 mongo.Connect 在网络卡顿或 DNS 失败时会永久阻塞(Go 协程卡死);不传 context 则无法被取消,服务重启时可能残留连接。context.WithTimeout(context.Background(), 10*time.Second) 是安全底线,别用 context.TODO() 或裸 context.Background()连接后务必调用 client.Ping(ctx, nil) 主动验证,否则首次查询失败才暴露问题URI 中密码含特殊字符(如 @、/)必须 URL 编码,否则 ApplyURI 解析失败且报错极隐晦:invalid URI插入数据为什么没生成 _id?结构体字段必须首字母大写 + bson tagGo 结构体字段小写(如 name string)是包私有,mongo-driver 序列化时直接跳过,导致插入空文档或丢失字段;_id 不自动生成是因为驱动根本没看到你定义的 Id 字段。字段名首字母必须大写:Name string,不是 name string显式声明 _id 字段并绑定:Id primitive.ObjectID `bson:"_id,omitempty"`(需 import "go.mongodb.org/mongo-driver/bson/primitive")不手动设 _id 时,用 primitive.NewObjectID() 赋值,或让驱动自动生成(插入后从 InsertOneResult.InsertedID 取)Find 返回空切片但没报错?检查 cursor.Close 和 Decode 顺序collection.Find 返回的是 *mongo.Cursor,它不立即拉取数据;若忘记 defer cursor.Close(ctx),连接池会被耗尽;若用 cursor.All 但没检查返回 error,空结果可能掩盖了权限不足或索引缺失等真实问题。 Mokker AI AI产品图添加背景
