Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang官方MongoDB司机反对怪异行为_Mongodb_Go - Fatal编程技术网

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

我正在尝试使用官方的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
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编写的,ommitemptystruct标记应该可以工作:

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版的驱动程序进行测试。