我的mongo数据库中有与此文档相似的文档
{
"_id": ObjectId("5cbf416ec6490b9baff4d284"),
"rewards" : [
{
"percent" : NumberLong(100),
"promotion_id" : "promotest"
}
],
"eligible_for": ["XYZ","ABC"]
}
当我更新了正确的文档后,它就正确地更新了文档
但是,当我通过奖励时,合格的为null,然后合格的更新为null,但奖励没有更新为null
{
"rewards" : null,
"eligible_for": null
}
然后是新更新的文档
{
"_id": ObjectId("5cbf416ec6490b9baff4d284"),
"rewards" : [
{
"percent" : NumberLong(100),
"promotion_id" : "promotest"
}
],
"eligible_for": null
}
这是我正在使用mongo-go-driver更新文档的查询。
r.PollingGameCollection.UpdateOne(ctx, bson.M{"_id": poll.RawId}, M{"$set": poll})
对象是:
type PollingGame struct {
RawId *objectid.ObjectID `json:"-" bson:"_id,omitempty"`
Rewards *[]Reward `json:"rewards,omitempty" bson:"rewards,omitempty"`
EligibleFor []string `json:"eligible_for,omitempty" bson:"eligible_for, omitempty"`
}
type Reward struct {
Percent int `json:"percent,omitempty" bson:"percent,omitempty"`
PromotionId string `json:"promotion_id,omitempty" bson:"promotion_id,omitempty"`
}
答案 0 :(得分:3)
首先:bson
标签值PollingGame.EligibleForbson"
中有多余的空格,请将其删除:bson:"eligible_for, omitempty"
。
如果删除该空间,您会发现它甚至不再将eligible_for
设置为null
。
原因是因为您使用了,omitempty
选项。这告诉驱动程序如果其值为nil
(零值),则排除该字段。因此,您想更新,但是这些字段不会包含在$set
操作中,因此它们不会更改。
如果您删除,omitempty
选项,它将起作用:
type PollingGame struct {
RawId *primitive.ObjectID `json:"-" bson:"_id,omitempty"`
Rewards *[]Reward `json:"rewards,omitempty" bson:"rewards"`
EligibleFor []string `json:"eligible_for,omitempty" bson:"eligible_for"`
}
(请注意,我也将objectid.ObjectID
更改为primitive.ObjectID
,因为那是您必须用于MongoDB对象ID的类型。)