ホームページ  >  記事  >  バックエンド開発  >  Go で Go Time として MongoDB データにアクセスするためのカスタム マーシャリングとアンマーシャリングを実装する方法

Go で Go Time として MongoDB データにアクセスするためのカスタム マーシャリングとアンマーシャリングを実装する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-27 16:31:10949ブラウズ

How to Implement Custom Marshalling and Unmarshalling to Access MongoDB Data as Go Time in Go?

Go から MongoDB へのアクセス: カスタム データ型の操作

Go を使用して MongoDB と対話する場合、マーシャリング中にデータ値の変更または変換が必要になる場合があります。そしてアンマーシャリング。これは、データが MongoDB に特定の形式で格納されているが、Go 構造体では別の形式が必要な場合に発生する可能性があります。

EndDate が MongoDB に文字列として格納されているが、それにアクセスしたい例を考えてみましょう。 clientConfigData 構造体の Go Time。

type clientConfigData struct {
    SMTPAssoc      int       `bson:"smtp_assoc"`
    PlanType       string    `bson:"plan_type"`
    EndDate        string    `bson:"end_date"`
}

カスタム マーシャリングとアンマーシャリングを実装するには、bson.Getter とbson.Setter インターフェイス。

import (
    "context"
    "time"

    "github.com/mongodb/mongo-go-driver/bson"
)

type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"` // Excluded from MongoDB
}

const endDateLayout = "2006-01-02 15:04:05"

// bson.Setter implementation
func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
    type my clientConfigData
    if err = raw.Unmarshal((*my)(c)); err != nil {
        return
    }
    c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
    return
}

// bson.Getter implementation
func (c *clientConfigData) GetBSON() (interface{}, error) {
    c.EndDateStr = c.EndDate.Format(endDateLayout)
    type my *clientConfigData
    return my(c), nil
}

// Custom code to query MongoDB
func FindConfig(ctx context.Context, client *mongo.Client) (*clientConfigData, error) {
    var configRes *clientConfigData
    err := client.Database("test").Collection("clientconfig").FindOne(ctx, bson.M{}).Decode(&configRes)
    if err != nil {
        return nil, errors.Wrap(err, "finding config collection")
    }
    return configRes, nil
}

SetBSON メソッドでは、まず生の値をアンマーシャリングし、次に EndDateStr フィールドを解析して EndDate フィールドに値を設定します。 GetBSON メソッドでは、EndDate フィールドを返す前に文字列にフォーマットします。

このカスタム ロジックを使用すると、MongoDB から Go Time として EndDate にアクセスできるようになります。

以上がGo で Go Time として MongoDB データにアクセスするためのカスタム マーシャリングとアンマーシャリングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。