go.mongodb.org/mongo-driver-具有NilValueObjectId的InsertOne

时间:2019-06-08 03:08:59

标签: mongodb go

我有以下结构

type Account struct {
    ID       primitive.ObjectID `json:"id" bson:"_id"`
    Email    string             `json:"email"`
    Password string             `json:"password"`
}

以及以下功能

func (a *Account) Create() map[string]interface{} {

    if resp, ok := a.Validate(); !ok {
        return resp
    }

    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(a.Password), bcrypt.DefaultCost)
    a.Password = string(hashedPassword)

    users := db.Collection("users")

    insertResult, err := users.InsertOne(context.TODO(), a)

    if err != nil {
        return utils.Message(false, "Error inserting user document "+err.Error())
    }

      ... more code down hre
}

我遇到的问题是我可以插入第一个帐户,但是由于_id字段上的dup键错误,此后无法插入任何帐户。我知道mongoDB会自动生成一个_id字段,如果有ID,它将使用提供的那个。就我而言,在此create函数中,a.ID(_id)始终为NilValue "_id" : ObjectId("000000000000000000000000")

即使我提供ID字段的值为nil,mongoDB可以为我生成_id吗?

我需要那里的Account.ID `bson: "_id"`属性,以便当我从mongoDB读取数据时可以对其进行解码,例如

func GetUser(email string) *Account {
        account := &Account{}
    users := db.Collection("users")

    filter := bson.D{{"email", email}}

    if err := users.FindOne(context.TODO(), filter).Decode(&account); err != nil {
        return utils.Message(false, "Error Retrieving account for "+email)
    }

        // account.ID will be available due to the bson tag
}

如果我做错了这件事,以及如何做得更好,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

我发现了问题。我没有在bson标签中添加```omitempty`。

应该是

type Account struct {
    ID       primitive.ObjectID `json:"id" bson:"_id,omitempty"`
    Email    string             `json:"email"`
    Password string             `json:"password"`
}