ホームページ > バックエンド開発 > Golang > Go で MongoDB ドキュメントをアンマーシャリングするときに Null 値を処理する方法は?

Go で MongoDB ドキュメントをアンマーシャリングするときに Null 値を処理する方法は?

Susan Sarandon
リリース: 2024-12-30 07:20:10
オリジナル
756 人が閲覧しました

How to Handle Null Values When Unmarshalling MongoDB Documents in Go?

MongoDB ドキュメントのアンマーシャリング中の Null 値の処理

MongoDB ドキュメントを Go 構造体にアンマーシャリングするプロセス中に null 値を無視することは、一般的なニーズです。この記事では、mongo-go-driver のカスタム デコーダーを使用したソリューションを検討します。

カスタム文字列デコーダー

最初に、文字列の null 値を処理しましょう。 null 値を空の文字列として解釈するカスタム デコーダを定義します。

import (
    "go.mongodb.org/mongo-driver/bson/bsoncodec"
    "go.mongodb.org/mongo-driver/bson/bsonrw"
)

type nullawareStrDecoder struct{}

func (nullawareStrDecoder) DecodeValue(dctx bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
    if !val.CanSet() || val.Kind() != reflect.String {
        return errors.New("bad type or not settable")
    }
    var str string
    switch vr.Type() {
    case bsontype.String:
        str, _ = vr.ReadString()
    case bsontype.Null:
        _ = vr.ReadNull()
    default:
        return fmt.Errorf("cannot decode %v into a string type", vr.Type())
    }

    val.SetString(str)
    return nil
}
ログイン後にコピー

カスタム デコーダの利用

このカスタム デコーダを特定のクライアントに使用するには、クライアントのレジストリに登録します。

clientOpts := options.Client().
    ApplyURI("mongodb://localhost:27017/").
    SetRegistry(
        bson.NewRegistryBuilder().
            RegisterDecoder(reflect.TypeOf(""), nullawareStrDecoder{}).
            Build(),
    )
client, err := mongo.Connect(ctx, clientOpts)
ログイン後にコピー

任意の Null に対するタイプ中立デコーダーValue

より包括的なアプローチには、任意の型の null 値を処理する型中立デコーダーの作成が含まれます。

import (
    "go.mongodb.org/mongo-driver/bson/bsoncodec"
    "go.mongodb.org/mongo-driver/bson/bsonrw"
    "reflect"
)

type nullawareDecoder struct {
    defDecoder bsoncodec.ValueDecoder
    zeroValue  reflect.Value
}

func (d *nullawareDecoder) DecodeValue(dctx bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
    if vr.Type() != bsontype.Null {
        return d.defDecoder.DecodeValue(dctx, vr, val)
    }

    if !val.CanSet() {
        return errors.New("value not settable")
    }
    _ = vr.ReadNull()
    val.Set(d.zeroValue)
    return nil
}
ログイン後にコピー

null を無視したい型ごとに、これを使用できます。デコーダ。たとえば、文字列と整数の場合:

customValues := []interface{}{
    "",       // string
    int(0),   // int
}

rb := bson.NewRegistryBuilder()
for _, v := range customValues {
    t := reflect.TypeOf(v)
    defDecoder, err := bson.DefaultRegistry.LookupDecoder(t)
    if err != nil {
        panic(err)
    }
    rb.RegisterDecoder(t, &nullawareDecoder{defDecoder, reflect.Zero(t)})
}

clientOpts := options.Client().
    ApplyURI("mongodb://localhost:27017/").
    SetRegistry(rb.Build())
client, err := mongo.Connect(ctx, clientOpts)
ログイン後にコピー

この設定では、アンマーシャリング中に null が検出された場合、指定された型の値はそれぞれのゼロ値に設定されます。

以上がGo で MongoDB ドキュメントをアンマーシャリングするときに Null 値を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート