在使用 bson.NewObjectId()
生成 bson.ObjectId
类型的 ID 时,很容易在使用 mongo-driver
包进行 MongoDB 操作时出现乱码问题。这是因为 bson.ObjectId
和 MongoDB 内部使用的是不同的字节序(big-endian vs. little-endian),导致在传输和存储时出现了编码不兼容的问题。
为了避免乱码问题,我们应该采用 mongo-driver
中提供的 primitive.NewObjectID()
函数来生成 primitive.ObjectID
类型的 ID,这个类型是 mongo-driver
特有的,并且是 MongoDB 内部原生支持的类型。使用 primitive.ObjectID
来传递 ID 可以避免出现乱码问题,同时也更为合理和方便。
示例代码:
import (
"go.mongodb.org/mongo-driver/bson/primitive"
)
// 先将「_id」字段从 bson.ObjectId 类型改为 primitive.ObjectID 类型
type User struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
Name string `bson:"name"`
Password string `bson:"password"`
Age int `bson:"age"`
}
// 在创建新用户时使用 primitive.NewObjectID() 来生成 MongoDB 支持的 ObjectID
func createUser(ctx iris.Context) {
// 获取请求数据并将其存储到 User 结构体中
var user User
if err := ctx.ReadJSON(&user); err != nil {
// 错误处理
}
// 为新用户生成 ObjectID
user.ID = primitive.NewObjectID()
// 向 MongoDB 中插入新用户
_, err := coll.InsertOne(ctx.Context(), user)
if err != nil {
// 错误处理
}
// 返回新用户的 ID
ctx.JSON(iris.Map{
"id": user.ID.Hex(),
})
}
需要注意的是,如果在之前的代码中已经使用了 bson.ObjectId
类型,改为使用 primitive.ObjectID
后可能会导致一些其他代码适配问题,因此需要确保所有地方都已经适配成功后再进行更改。