在正式的mongoDB驱动程序中,ObjectID自动设置为“ 0 ... 0”

时间:2019-09-03 17:53:56

标签: mongodb go

我正在尝试使用Go将用户条目保存在MongoDB数据库中。用户应自动获得一个ID。我正在使用官方的MongoDB Go驱动程序。

我的来历尤其是https://vkt.sh/go-mongodb-driver-cookbook/https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial

结构看起来像这样:

type User struct {
    ID primitive.ObjectID `json:"_id" bson:"_id"`
    Fname string `json:"fname" bson:"fname"`
    Lname string `json:"lname" bson:"lname"`
    Mail string `json:"mail" bson:"mail"`
    Password string `json:"password" bson:"password"`
    Street string `json:"street" bson:"street"`
    Zip string `json:"zip" bson:"zip"`
    City string `json:"city" bson:"city"`
    Country string `json:"country" bson:"country"`
}

设置数据库(连接有效)并注册用户(基于HTTP请求r,其中有用户在其正文中):

ctx := context.Background()
uriDB := "someURI"
clientOptions := options.Client().ApplyURI(uriDB)
client, err := mongo.Connect(ctx, clientOptions)
collection := client.Database("guDB").Collection("users")

...

var user User
err := json.NewDecoder(r.Body).Decode(&user)

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
result, err := collection.InsertOne(ctx, user)
...

当我输入第一个用户时,它会添加到集合中,但ID如下所示: _id:ObjectID(000000000000000000000000)

如果我现在想输入另一个用户,则会出现以下错误:

multiple write errors: [{write errors: [{E11000 duplicate key error collection: guDB.users index: _id_ dup key: { : ObjectId('000000000000000000000000') }}]}, {<nil>}]

因此似乎再次分配了ObjectID 000000000000000000000000

我希望每个条目的ID都会自动设置为唯一值。

我是否必须手动设置ID或如何为用户分配唯一ID?

2 个答案:

答案 0 :(得分:1)

Per the documentation you linked, you must set the object ID yourself when using structs

_, err := col.InsertOne(ctx, &Post{
    ID:        primitive.NewObjectID(),    // <-- this line right here
    Title:     "post",
    Tags:      []string{"mongodb"},
    Body:      `blog post`,
    CreatedAt: time.Now(),
})

使用bson.M之前的示例无需指定ID,因为它们根本不发送_id字段;使用结构,字段将以其零值发送(如您所见)。

答案 1 :(得分:0)

如果设置文档_id,则mongodb将在插入过程中将_id用于该文档,并且不会生成。您必须忽略它,或者使用primitive.NewObjectID()手动设置它。