0

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

我想避免用于更新的硬编码字段查询。

只是想知道这是否受支持,如果是,您能帮我解决这个问题,并指出一些深入的链接。

4

1 回答 1

2

如果您可以控制代码,则可以尝试在结构上创建方法。这些方法可以帮助您构建字段路径以执行部分​​更新。例如,如果您有以下结构:

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)
于 2020-05-04T01:57:38.383 回答