英文:
bson cannot Decode to nil value with bson:"omitempty" struct tag
问题
我有一个结构体:
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Username *string `json:"username" bson:"username,omitempty"`
FirstName *string `json:"firstName" bson:"first_name,omitempty"`
LastName *string `json:"lastName" bson:"last_name,omitempty"`
Email *string `json:"email" bson:"email,omitempty"`
GoogleID *string `json:"googleID" bson:"google_id,omitempty"`
PageURLs []string `json:"pageURLs" bson:"pages"`
Schema int `json:"-" bson:"schema"` // 在graphql中被省略
}
我调用了这段代码:
updateOption := options.FindOneAndUpdate().SetUpsert(true)
updateData := bson.M{"$set": *user}
filter := bson.M{"google_id": user.GoogleID}
// 更新后的用户将具有Id
err = findOneUserAndUpdate(context.TODO(), filter, updateData, updateOption).Decode(updatedUser)
使用以下用户:
var testFirstname = "first"
var testLastname = "last"
var testEmail = "test@gmail.com"
var testGoogleID = "abc123"
testUser = &model.User{
FirstName: &testFirstname,
LastName: &testLastname,
Email: &testEmail,
GoogleID: &testGoogleID,
PageURLs: []string{},
Schema: 1,
}
但是我收到了这个错误:无法解码为nil值。这可能是因为指针为nil,但omitempty构建标签应该在这种情况下省略字段。为什么会失败呢?
英文:
I have a struct:
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Username *string `json:"username" bson:"username,omitempty"`
FirstName *string `json:"firstName" bson:"first_name,omitempty"`
LastName *string `json:"lastName" bson:"last_name,omitempty"`
Email *string `json:"email" bson:"email,omitempty"`
GoogleID *string `json:"googleID" bson:"google_id,omitempty"`
PageURLs []string `json:"pageURLs" bson:"pages"`
Schema int `json:"-" bson:"schema"` // omitted from graphql
}
I'm calling this code:
updateOption := options.FindOneAndUpdate().SetUpsert(true)
updateData := bson.M{"$set": *user}
filter := bson.M{"google_id": user.GoogleID}
// updated user will have Id
err = findOneUserAndUpdate(context.TODO(), filter, updateData, updateOption).Decode(updatedUser)
With the following user:
var testFirstname = "first"
var testLastname = "last"
var testEmail = "test@gmail.com"
var testGoogleID = "abc123"
testUser = &model.User{
FirstName: &testFirstname,
LastName: &testLastname,
Email: &testEmail,
GoogleID: &testGoogleID,
PageURLs: []string{},
Schema: 1,
}
but I'm getting this error saying: cannot Decode to nil value. This is probably because a pointer is nil, but the omitempty build tag should just omit the field in that case. Why would it fail to do so?
答案1
得分: 1
updatedUser是不能为nil的,你需要至少给它一个空的结构体以便解码。
英文:
updatedUser is what cannot be nil, you need to give it an empty struct at least to decode into.
答案2
得分: -1
似乎updateData := bson.M{"$set": *user}
不是有效的字符串。你可以尝试updateData := bson.M{"$set": &user}
,这似乎可以工作。
英文:
Seems like updateData := bson.M{"$set": *user}
is not valid string. You can try updateData := bson.M{"$set": &user}
that seems to work.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论