go mongo驱动程序更新无法将对象数组设置为null

时间:2019-10-11 11:14:57

标签: mongodb go mongo-go

我的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"`
}

1 个答案:

答案 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的类型。)