在mongoDB中使用golang结构进行嵌套字段更新

时间:2020-04-29 10:34:13

标签: mongodb go mongo-go

我使用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",
    }
}

我要避免进行硬编码的字段查询以进行更新。

只想知道是否支持此功能,如果可以,您可以帮我解决这个问题,并指向与此有关的一些深潜链接。

1 个答案:

答案 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)