登录
首页 >  Golang >  Go问答

Golang官方MongoDB驱动中ObjectID的异常特性

来源:stackoverflow

时间:2024-03-14 23:45:26 213浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Golang官方MongoDB驱动中ObjectID的异常特性》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我正在尝试在 golang 中使用官方 mongodb 驱动程序,但看到了一些意外的情况。

如果我有一个像这样的结构

type user struct {
    id     primitive.objectid `json:"id" bson:"_id"`
    name   string             `json:"name" bson:"name"`
    email  string             `json:"email" bson:"email"`
}

我使用 nameemail 创建了一个新实例,但省略了 id,期望数据库将用其值填充它。相反,它使用全零,因此第二个等插入失败并显示

multiple write errors: [{write errors: [{e11000 duplicate key error collection: collection.name index: _id_ dup key: { : objectid('000000000000000000000000') }}]}, {}]

如果我使用 *primitive.objectid 我只在 null 而不是零上得到相同类别的错误

multiple write errors: [{write errors: [{E11000 duplicate key error collection: collection.name index: _id_ dup key: { : null }}]}, {}]

无论我是否使用 omitempty 指令,结果都是一样的。

如果我完全省略 id 字段,它可以工作,但我的结构上没有该数据。

有没有办法让数据库处理id?或者必须我在结构上显式调用 newobjectid() 函数?


解决方案


id 上的 omitempty 标签应该可以工作。例如:

type user struct {
    id     primitive.objectid `json:"id" bson:"_id,omitempty"`
    name   string             `json:"name" bson:"name"`
    email  string             `json:"email" bson:"email"`
}

collection.insertone(context.background(), user{name:"foo", email:"baz"})

如果您不指定 omitepmty 标记,那么您观察到的行为只是 Go structs 行为;因此,如果省略任何结构字段,它将为零值。在本例中,由于您已将字段类型指定为 primitive.ObjectID,因此 objectid('000000000000000000000000') 为零值。

这就是为什么在插入之前需要先生成一个值的原因,即:

collection.insertone(context.background(), 
                     user{ id: primitive.newobjectid(), 
                           name: "foo", 
                           email: "bar"})

从技术上讲,如果在发送到服务器之前未提供 ObjectId,则 mongodb 驱动程序会自动生成 ObjectId

插入时可以尝试使用 bson.M 而不是结构体,以省略 _id 字段,即

collection.InsertOne(context.Background(), 
                     bson.M{"name":"Foo", "email":"Bar"})

上面的代码片段是使用 mongo-go-driver v1.3.x 编写的

终于介绍完啦!小伙伴们,这篇关于《Golang官方MongoDB驱动中ObjectID的异常特性》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>