Mise à jour des champs MongoDB avec l'indicateur Omitempty dans les structures Golang
L'indicateur omitempty dans les structures Golang permet aux développeurs d'exclure les champs du marshalling JSON s'ils en ont valeurs nulles. Cependant, ce comportement peut poser des problèmes lors de la mise à jour des documents MongoDB.
Considérez un formulaire de coupon où certains champs sont facultatifs. Une structure Golang représentant le formulaire peut avoir des indicateurs d'omimpty sur ces champs comme :
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"` }
Problème
Le problème survient lors de la mise à jour du formulaire. Si une case précédemment cochée (champ booléen) est décochée lors de la soumission du formulaire, l'indicateur omitempty l'exclut de la structure. Par conséquent, la valeur n'est pas mise à jour dans le document MongoDB.
De même, si seuls les champs obligatoires sont fournis dans une requête API REST, MongoDB écrase l'intégralité du document, y compris les valeurs qui ne doivent pas être mises à jour.
Solution
Pour palier à ce problème, il faut changer les champs annotés avec omitempty en pointeurs. Cela permet aux champs d'avoir une valeur nulle, qui représente l'état "non mis à jour":
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"` }
Avec cette modification, un pointeur nul indique que le champ ne doit pas être mis à jour. Si un pointeur non nul est fourni, sa valeur sera définie dans le document MongoDB. Cela résout efficacement le problème de mise à jour des champs bool et int tout en conservant l'indicateur omitempty.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!