Golang官方MongoDB司机反对怪异行为
我正在尝试使用官方的golang mongodb驱动程序,我看到了一些意想不到的事情 如果我有一个像Golang官方MongoDB司机反对怪异行为,mongodb,go,Mongodb,Go,我正在尝试使用官方的golang mongodb驱动程序,我看到了一些意想不到的事情 如果我有一个像 type User struct { ID primitive.ObjectID `json:"id" bson:"_id"` Name string `json:"name" bson:"name"` Email string `json:"email" bson:"email"` } 我用Name和Ema
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id"`
Name string `json:"name" bson:"name"`
Email string `json:"email" bson:"email"`
}
我用Name
和Email
创建了一个新的实例,但省略了ID,希望DB用它的值填充它。相反,它使用全零,因此第二个等插入会失败
multiple write errors: [{write errors: [{E11000 duplicate key error collection: collection.name index: _id_ dup key: { : ObjectId('000000000000000000000000') }}]}, {<nil>}]
不管我是否使用ommitempty
指令,结果都是一样的
如果我完全省略ID
字段,它会工作,但是我的结构上没有该数据
有没有办法让DB处理ID?或者我必须显式调用结构上的NewObjectID()
函数吗
不管我是否使用ommitempty指令,结果都是一样的
ID
上的empty
标记应该可以工作。例如:
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"})
如果您没有指定省略mty
标记,那么您观察到的行为就是行为;如果省略任何结构字段,则其值为零。在本例中,由于您已将字段类型指定为,ObjectId('000000000000000000000000')
为零值
这就是为什么在插入之前需要先生成值的原因,即:
collection.InsertOne(context.Background(),
User{ ID: primitive.NewObjectID(),
Name: "Foo",
Email: "Bar"})
有没有办法让DB处理ID
从技术上讲,如果在发送到服务器之前没有提供,MongoDB驱动程序会自动生成
您可以尝试在插入时使用而不是结构来省略\u id
字段,即
collection.InsertOne(context.Background(),
bson.M{"name":"Foo", "email":"Bar"})
上面的代码片段是使用v1.3.x编写的
不管我是否使用ommitempty指令,结果都是一样的
ID
上的empty
标记应该可以工作。例如:
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"})
如果您没有指定省略mty
标记,那么您观察到的行为就是行为;如果省略任何结构字段,则其值为零。在本例中,由于您已将字段类型指定为,ObjectId('000000000000000000000000')
为零值
这就是为什么在插入之前需要先生成值的原因,即:
collection.InsertOne(context.Background(),
User{ ID: primitive.NewObjectID(),
Name: "Foo",
Email: "Bar"})
有没有办法让DB处理ID
从技术上讲,如果在发送到服务器之前没有提供,MongoDB驱动程序会自动生成
您可以尝试在插入时使用而不是结构来省略\u id
字段,即
collection.InsertOne(context.Background(),
bson.M{"name":"Foo", "email":"Bar"})
上面的代码片段是使用v1.3.x编写的,
ommitempty
struct标记应该可以工作:
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Name string `json:"name" bson:"name"`
Email string `json:"email" bson:"email"`
}
primitive.ObjectID
类型实现了bsoncodec.Zeroer
接口,因此如果它是空的对象ID(全部为0),则应该从文档中省略它,并且驱动程序将为您生成一个新的对象ID。您能试试这个并发布输出吗?省略空的结构标记应该可以工作:
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Name string `json:"name" bson:"name"`
Email string `json:"email" bson:"email"`
}
primitive.ObjectID
类型实现了bsoncodec.Zeroer
接口,因此如果它是空的对象ID(全部为0),则应该从文档中省略它,并且驱动程序将为您生成一个新的对象ID。你能试试这个并发布输出吗?我认为服务器从来没有给\u id
赋值,我认为总是由客户端(或客户端驱动程序)负责生成它们。如果是这样的话,为什么驱动程序在看到插入了“null”或“0000000…”值时不设置值?有没有这样的案例?为什么与未指定\u id
字段不同?我认为服务器从未为\u id
赋值,我认为总是由客户端(或客户端驱动程序)负责生成值。如果是这样,那么为什么驱动程序在看到插入“null”或“0000000…”值时不设置值?有没有这样的案例?为什么它与未指定\u id
字段的情况有所不同?省略empty
无法修复它。它仍然使用零/零值。这一点在原始帖子中已经提到。您使用的是哪个版本的mongodb go驱动程序?还有结构上的代码段以及如何插入?ommitempty
无法修复它。它仍然使用零/零值。这一点在原始帖子中已经提到。您使用的是哪个版本的mongodb go驱动程序?还有结构上的代码段以及如何插入?ommitempty
无法修复它。它仍然使用零/零值。这一点在原始帖子中有所说明。您可以与添加的ommitempty
共享代码吗?我在结构定义中添加了ommitempty
,驱动程序按照预期为文档生成了一个对象ID。我正在使用驱动程序的v1.3.0进行测试。ommitempty
无法修复它。它仍然使用零/零值。这一点在原始帖子中有所说明。您可以与添加的ommitempty
共享代码吗?我在结构定义中添加了ommitempty
,驱动程序按照预期为文档生成了一个对象ID。我正在使用v1.3.0版的驱动程序进行测试。