我使用golang mongo驱动程序遇到更新文档问题。 场景:我想更新嵌套在结构中的字段。例如:StructOuter-> structInner-> field1,field2,field3。现在,如果我要更新field3,并且具有对应的值作为另一个结构,那么如何仅通过更新此字段就可以继续进行。我尝试使用下面的代码,但它会更新整个structInner,仅保留field3:
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",
}
}
我要避免进行硬编码的字段查询以进行更新。
只想知道是否支持此功能,如果可以,您可以帮我解决这个问题,并指向与此有关的一些深潜链接。
答案 0 :(得分:1)
如果您可以控制代码,则可以尝试在结构上创建方法。这些方法可以帮助您构造字段路径以执行部分更新。例如,如果您具有以下结构:
type Outer struct {
Data Inner `bson:"data"`
}
type Inner struct {
FieldThree string `bson:"field_three"`
FieldFour string `bson:"field_four"`
}
您可以尝试添加以下方法来构造更新语句。这些以dot-notation格式返回。
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)