sql >> データベース >  >> NoSQL >> MongoDB

GoからMongoDBにアクセスする

    MongoDBとの間で値をマーシャリング/アンマーシャリングするときに値を変更したり型変換を実行したりする場合は、カスタムのマーシャリング/アンマーシャリングロジックを実装することで実行できます。

    これを行うには、bson.Getterを実装します。 およびbson.Setter インターフェイス。これらのメソッド内では、値をマーシャリング/アンマーシャリングして、やりたいことを何でも行うことができます。

    最も簡単なのは、clientConfigDataを拡張することです。 time.Timeタイプの追加フィールドを入力します。 、必要な値:

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

    タグ値はbson:"-"です。 、これをMongoDBに表示したくないためです。

    そして今、カスタムマーシャリング/アンマーシャリングロジック:

    const endDateLayout = "2006-01-02 15:04:05" // Use your layout here
    
    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
    }
    
    func (c *clientConfigData) GetBSON() (interface{}, error) {
        c.EndDateStr = c.EndDate.Format(endDateLayout)
        type my *clientConfigData
        return my(c), nil
    }
    

    ここで何が起こるかは、SetBSON() 構造体の値にMongoDBからの生の値を「入力」し、GetBSON() 保存(マーシャリング)したい値を提供する責任があります。

    ロード時:SetBSON() 最初に値をそのままアンマーシャリングしてから、EndDateを適切に設定します フィールド(タイプはtime.Timestringから DBから取得した日付値(EndDateStr

    保存する場合:GetBSON() 最初にEndDateStrを入力します EndDateのフィールド(保存されているフィールド) フィールドに移動し、単に戻って、保存しても問題がないことを通知します。

    注意すべき1つのこと:両方のSetBSON() およびGetBSON() 新しいmyを作成します それらの中に入力します。これは、スタックオーバーフローを回避するためです。タイプclientConfigDataの値を返すだけです bson.Getterを実装したので、悪いです およびbson.Setter 、したがってSetBSON() およびGetBSON() 延々と呼ばれるでしょう。新しいmy typeにはこれらのメソッドがないため、無限の「再帰」は発生しません(type キーワードは新しいタイプを作成し、基になるタイプのメソッドを「継承」しません。

    関連/同様の質問も参照してください:time.Timeフィールドを使用してドキュメントを挿入するときにデフォルトの日付を設定する




    1. MongoDBで最近削除されたドキュメントを回復する方法はありますか?

    2. C#でMongoDBの指定されたフィールドのみを取得します

    3. 一般的なMongoDBインタビューの質問

    4. MongooseおよびNodeJ、Expressを使用したMongoDB4.0トランザクション