Перейти обновление драйвера Монго не может установить массив объектов на ноль - PullRequest
4 голосов
/ 11 октября 2019

У меня есть документы, аналогичные этому документу, в моей базе данных mongo

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

}

Когда я обновляюсь с соответствующим документом, он корректно обновляет документ

Но когда я передаю вознаграждение, elitable_forкак пустое значение, затем elptable_for за обновление до нулевого значения, но вознаграждение за то, что оно не обновляется до нулевого

{
    "rewards" : null,
    "eligible_for": null

}

, затем за обновленный документ

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

}

Это запрос, который я использую для обновления документа с использованиеммонго-гоу-драйвер. 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 Ответ

3 голосов
/ 11 октября 2019

Во-первых: у вас есть дополнительный пробел в значении 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.)

...