簡體   English   中英

在 mongoDB 中使用 golang 結構更新嵌套字段

[英]Nested field update using golang struct in mongoDB

我遇到了使用 golang mongo 驅動程序更新文檔的問題。 場景:我想更新嵌套在結構中的字段。 例如:StructOuter -> structInner -> field1、field2、field3。 現在,如果我想更新 field3 並且我有相應的值作為另一個結構,我怎么能通過單獨更新這個字段來提前 go。 我嘗試使用下面的代碼,但它更新了整個 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",
    }
}

我想避免用於更新的硬編碼字段查詢。

只是想知道這是否受支持,如果是,您能幫我解決這個問題,並指出一些深入的鏈接。

如果您可以控制代碼,則可以嘗試在結構上創建方法。 這些方法可以幫助您構建字段路徑以執行部分更新。 例如,如果您有以下結構:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM