首頁 > 後端開發 > Golang > 如何在 MongoDB 中實作複雜結構的自訂 BSON 編組?

如何在 MongoDB 中實作複雜結構的自訂 BSON 編組?

Susan Sarandon
發布: 2024-12-03 07:07:10
原創
601 人瀏覽過

How to Implement Custom BSON Marshalling for Complex Structures in MongoDB?

複雜結構的自訂BSON 編組

處理需要非預設編組的自訂資料結構時,在MongoDB 中從JSON 轉換為BSON可能具有挑戰性。本文將指導您為複雜結構自訂 BSON 編組,提供問題中所述的 JSON 編組方法的等效實作。

自訂 BSON 介面

自訂 BSON編組涉及實作兩個介面:Getter 和 Setter。 Getter 介面定義如何在 BSON 中表示對象,而 Setter 介面則指定如何從 BSON 初始化對象。

自訂貨幣結構

考慮原始問題的貨幣結構:

type Currency struct {
    value        decimal.Decimal //The actual value of the currency.
    currencyCode string          //The ISO currency code.
}
登入後複製

在這種情況下,您想要自訂編組過程以輸出特定的BSON 表示。

實現Getter 和Setter

要實現此目的,請實現Getter 和Setter 接口,如下所示:

// GetBSON implements bson.Getter.
func (c Currency) GetBSON() (interface{}, error) {
    f := c.Value().Float64()
    return struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        f,
        CurrencyCode: c.currencyCode,
    }, nil
}

// SetBSON implements bson.Setter.
func (c *Currency) SetBSON(raw bson.Raw) error {

    decoded := new(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    })

    bsonErr := raw.Unmarshal(decoded)

    if bsonErr == nil {
        c.value = decimal.NewFromFloat(decoded.Value)
        c.currencyCode = decoded.CurrencyCode
        return nil
    } else {
        return bsonErr
    }
}
登入後複製

用法:

與Getter 和Setter一起使用實作到位後,您現在可以使用 mgo 函式庫的 Marshal 方法將Currency 結構封送為 BSON。例如,在 Product 結構中:

type Product struct {
    Name  string
    Code  string
    Price currency.Currency
}
登入後複製

編組包含貨幣欄位的 Product 結構時,將自動套用自訂 BSON 編組。

以上是如何在 MongoDB 中實作複雜結構的自訂 BSON 編組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板