オプション フィールドを含むフォームを処理する場合、それらのフィールドを空の文字列、false ブール値、またはJSON のゼロ値の整数。ただし、Golang 構造でomitempty フラグを使用すると、マッピング中にこれらの値が明示的に無視されるため、MongoDB でドキュメントを更新するときに問題が発生する可能性があります。
でクーポン構造を検討してください。フィールドがomitemptyとしてマークされているGolang:
type Coupon struct { Id int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Status bool `json:"status" bson:"status"` }
最初の保存中に、空でないフィールドはすべて正常に保存されます。モンゴDB。ただし、その後の更新時に、オプションのフィールドが空の値 (チェックボックスがオフになっているなど) に変更されている場合、omitempty フラグにより、空の値が構造体にマッピングされなくなります。その結果、更新操作は既存のフィールドの値を変更できません。
この問題は、bool 型と int 型には 2 つの値しかないために発生します (false と true、0 と 0)。それぞれゼロ以外)。 bool フィールドの 3 つの状態 (更新しない、false に設定、true に設定) を表す必要性と、int フィールドの同様のケースに対応するには、ポインターを使用するように構造体フィールドを変更する必要があります。
type Coupon struct { Id *int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Status *bool `json:"status" bson:"status"` }
ポインターの場合、nil 値は省略されたフィールドを表します。非 nil ポインターの場合、ポイントされた値はフィールドの値を表します。したがって、次のシナリオを処理できます:
ポインターとomitempty フラグを利用すると、MongoDB の既存の値をオーバーライドすることなく更新が正しく実行されるようにしながら、Golang 構造のオプションのフィールドを効果的に処理できます。
以上がMongoDB ドキュメントを更新するときに Go で「omitempty」を使用してオプションのフィールドを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。