ホームページ >バックエンド開発 >Golang >MongoDB ドキュメントを更新するときに Go で「omitempty」を使用してオプションのフィールドを処理する方法は?

MongoDB ドキュメントを更新するときに Go で「omitempty」を使用してオプションのフィールドを処理する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-24 21:46:36918ブラウズ

How to Handle Optional Fields with `omitempty` in Go When Updating MongoDB Documents?

Omitempty および MongoDB 更新によるオプション フィールドの処理

オプション フィールドを含むフォームを処理する場合、それらのフィールドを空の文字列、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 ポインターの場合、ポイントされた値はフィールドの値を表します。したがって、次のシナリオを処理できます:

  • bool フィールドを除外するには、*bool 値は nil である必要があります。
  • false に設定/更新するには、それはfalse の値へのポインタです。
  • これを true に設定/更新するには、true へのポインタでなければなりませんvalue.

ポインターとomitempty フラグを利用すると、MongoDB の既存の値をオーバーライドすることなく更新が正しく実行されるようにしながら、Golang 構造のオプションのフィールドを効果的に処理できます。

以上がMongoDB ドキュメントを更新するときに Go で「omitempty」を使用してオプションのフィールドを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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