MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment mettre à jour les champs Mongodb avec l'indicateur omiempty dans la structure Golang

Une valeur de bool type a 2 valeurs possibles :false et true . Et vous voulez "communiquer" 3 états différents avec un bool champ, à savoir ne pas mettre à jour le champ, pour définir le champ sur false et pour définir le champ sur true . Ce n'est évidemment pas possible.

Même chose pour int valeurs :une valeur de 0 ne peut pas représenter 2 choix différents, à savoir ne pas mettre à jour le champ et le mettre à 0 .

Si vous souhaitez conserver le omitempty options dans les valeurs des balises, puis pour que cela fonctionne, vous devez changer les champs en pointeurs :

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"`
}

La façon dont cela fonctionne est que si le pointeur est nil , il sera omis (c'est le "omitempty" option). Si le champ est non nil pointeur, il sera mis à jour à la valeur pointée.

Ainsi, par exemple, si vous souhaitez exclure un bool champ, puis le *bool la valeur devrait/sera nil . Si vous souhaitez le définir / le mettre à jour sur false , il doit s'agir d'un pointeur vers un false évaluer. Si vous souhaitez le définir / le mettre à jour sur true , il doit s'agir d'un pointeur vers un true valeur.

En général, tout type dont la la valeur zéro est possible et doit être pris en compte, vous ne pouvez gérer que "c'est la valeur zéro" et "il manque à l'entrée" si vous en faites un pointeur, et le nil la valeur du pointeur indiquera le cas "absent de l'entrée", tandis qu'un non-nil pointeur vers la valeur zéro indiquera le cas "il s'agit de la valeur zéro". Ainsi, dans l'exemple ci-dessus, si la string les champs peuvent également prendre la valeur de chaîne vide ("" ), alors vous devez également en faire des pointeurs.

Notez que vous pouvez également y parvenir en utilisant une logique de marshaling et de démarshaling personnalisée, mais c'est plus lourd, et l'utilisation de pointeurs vous le donne automatiquement.