首頁 >後端開發 >Golang >如何在 Go 中使用 MongoDB 處理嵌入式類型和 JSON 封送處理?

如何在 Go 中使用 MongoDB 處理嵌入式類型和 JSON 封送處理?

Susan Sarandon
Susan Sarandon原創
2024-11-08 19:42:02513瀏覽

How to Handle Embedded Types and JSON Marshaling with MongoDB in Go?

Go 中 MongoDB 的嵌入類型和 JSON 編組

在 MongoDB 中,嵌入類型是表示分層資料結構的常用方法。然而,當使用帶有嵌入類型的 Go 的 JSON 編碼器時,重要的是要考慮如何處理省略的欄位。

假設你有一個 User 結構,其中的 Secret 字段用 json:"-" 註釋,以將其從常規 JSON 中排除回應。若要傳回管理員使用者的 Secret 字段,您可能會想要建立一個具有重複 Secret 欄位的單獨的 adminUser 結構。但是,這種方法會重複程式碼並可能導致維護問題。

相反,請考慮對 adminUser 中的 User 欄位使用 bson:",inline" 標籤。這指示 JSON 編碼器內聯嵌入結構的字段,有效地將它們組合成單一 JSON 物件。

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

但是,這種方法在從 MongoDB 讀取時可能會引入重複的鍵錯誤,因為 adminUser 和使用者包含 Secret 欄位。若要解決此問題,請從 User 中刪除 Secret 字段,並將其僅包含在 adminUser 中。

type User struct {
    Id   bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
    Name string        `json:"name,omitempty" bson:"name,omitempty"`
}

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

現在,當檢索具有管理員使用者的使用者時,Secret 欄位將包含在 JSON 回應中。

func getUser(w http.ResponseWriter, r *http.Request) {
    ....omitted code...

    var user adminUser
    err := common.GetDB(r).C("users").Find(
        bson.M{"_id": userId},
    ).One(&user)
    if err != nil {
        return
    }
    common.ServeJSON(w, &user)
}

此方法保留了 User 結構的單一事實來源,並允許您根據使用者權限動態包含或排除秘密欄位。

以上是如何在 Go 中使用 MongoDB 處理嵌入式類型和 JSON 封送處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn