ホームページ >バックエンド開発 >Golang >Golang の `omitempty` フラグを使用して MongoDB の更新を処理する方法は?

Golang の `omitempty` フラグを使用して MongoDB の更新を処理する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-24 11:56:16600ブラウズ

How to Handle MongoDB Updates with Golang's `omitempty` Flag?

Golang 構造の Omitempty フラグを使用した MongoDB フィールドの更新

Golang 構造のomitempty フラグを使用すると、開発者は、フィールドが JSON マーシャリングから除外されるようになります。ゼロ値。ただし、この動作は、MongoDB ドキュメントを更新するときに問題を引き起こす可能性があります。

一部のフィールドがオプションであるクーポン フォームを考えてみましょう。フォームを表す Golang 構造では、次のようなフィールドにomitempty フラグが設定されている可能性があります。

type Coupon struct {
    Id               int    `json:"id,omitempty" bson:"_id,omitempty"`
    Name             string `json:"name,omitempty" bson:"name,omitempty"`
    Code             string `json:"code,omitempty" bson:"code,omitempty"`
    Description      string `json:"description,omitempty" bson:"description,omitempty"`
    Status           bool   `json:"status" bson:"status"`
    MaxUsageLimit    int    `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
    SingleUsePerUser bool   `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}

問題

フォームの更新時に問題が発生します。以前にチェックしたチェックボックス (ブール型フィールド) がフォーム送信時にチェックを外された場合、omitempty フラグによってそのチェックボックスが構造から除外されます。その結果、MongoDB ドキュメント内の値は更新されません。

同様に、REST API リクエストで必須フィールドのみが指定された場合、MongoDB は更新すべきでない値を含むドキュメント全体を上書きします。

解決策

この問題を解決するには、注釈が付けられたフィールドを変更する必要があります。ポインタを省略します。これにより、フィールドが「更新されていない」状態を表す nil 値を持つことができます。

type Coupon struct {
    Id               *int    `json:"id,omitempty" bson:"_id,omitempty"`
    Name             string `json:"name,omitempty" bson:"name,omitempty"`
    Code             string `json:"code,omitempty" bson:"code,omitempty"`
    Description      string `json:"description,omitempty" bson:"description,omitempty"`
    Status           *bool   `json:"status" bson:"status"`
    MaxUsageLimit    *int    `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
    SingleUsePerUser *bool   `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}

この変更により、nil ポインターはフィールドが更新されないことを示します。非 nil ポインターが指定された場合、その値は MongoDB ドキュメントに設定されます。これにより、omitempty フラグを保持したまま bool フィールドと int フィールドを更新する際の問題が効果的に解決されます。

以上がGolang の `omitempty` フラグを使用して MongoDB の更新を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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