Обновление вложенного поля с использованием golang struct в mongoDB - PullRequest
0 голосов
/ 29 апреля 2020

Возникла проблема с обновлением документа с использованием драйвера golang mon go. Сценарий: я хочу обновить поле, вложенное в структуру. Например: StructOuter -> structInner -> field1, field2, field3. Теперь, если я хочу обновить field3 и у меня есть соответствующее значение в качестве другой структуры, как я могу go вперед, просто обновив это поле в одиночку. Я попытался с помощью приведенного ниже кода, но он обновляет весь structInner, оставляя только поле 3:

conv, _ := bson.Marshal(prod)
bson.Unmarshal(conv, &updateFields)
update := bson.M{
   "$set": updateFields,
}
model.SetUpdate(update). 

Пример JSON:

{
    "field_one": "value",
    "data": {
        "field_two": [
            "data1",
            "data2"
        ],
        "field_three": "check",
        "field_four": "abc",
        "field_five": "work",
    }
}

Я хочу избежать жесткого запроса полей для обновления.

Просто хочу узнать, поддерживается ли это, если да, можете ли вы помочь мне с этим, а также указать на некоторые глубокие ссылки для погружения по этому вопросу.

1 Ответ

0 голосов
/ 04 мая 2020

Если у вас есть контроль над кодом, вы можете попробовать создать методы в структуре. Эти методы могут помочь вам построить путь к полям для частичного обновления. Например, если у вас есть следующие структуры:

type Outer struct {
    Data Inner  `bson:"data"`
}

type Inner struct {
    FieldThree string `bson:"field_three"`
    FieldFour string `bson:"field_four"`
}

Вы можете попробовать добавить методы, как показано ниже, для построения операторов обновления. Они возвращаются в формате точка-нотация .

func (o *Outer) SetFieldThree(value string) bson.E {
    return bson.E{"data.field_three", value}
}
func (o *Outer) SetFieldFour(value string) bson.E {
    return bson.E{"data.field_four", value}
} 

Чтобы обновить, вы можете построить операторы, как показано ниже:

x := Outer{}
var updateFields bson.D
updateFields = append(updateFields, x.SetFieldThree("updated"))
updateFields = append(updateFields, x.SetFieldFour("updated"))

statement := bson.D{{"$set", updateFields}} 
result, err := collection.UpdateOne(ctx, bson.M{}, statement)
...