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 サイトの他の関連記事を参照してください。