4

我的 mongo db 中有与此文档类似的文档

{
    "_id": ObjectId("5cbf416ec6490b9baff4d284"),
    "rewards" : [ 
        {
            "percent" : NumberLong(100),
            "promotion_id" : "promotest"
        }
    ],
    "eligible_for": ["XYZ","ABC"]

}

当我使用正确的文档进行更新时,它会正确更新文档

但是当我通过奖励时,qualified_for 为 null,然后qualified_for 更新为 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"`
}
4

1 回答 1

5

bson第一:你的标签值中有一个额外的空格PollingGame.EligibleForbson",删除它:bson:"eligible_for, omitempty"

如果您删除该空间,您会注意到它甚至不再设置eligible_fornull

原因是因为您使用了该,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.ObjectIDprimitive.ObjectID那是您必须用于 MongoDB 对象 ID 的类型。)

于 2019-10-11T11:57:13.813 回答