sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo actualizar los campos de Mongodb con el indicador omitempty en la estructura de Golang

Un valor de bool type tiene 2 valores posibles:false y true . Y desea "comunicar" 3 estados diferentes con un bool campo, es decir, no actualizar el campo, establecer el campo en false y para establecer el campo en true . Esto obviamente no es posible.

Lo mismo ocurre con int valores:un valor de 0 no puede representar 2 opciones diferentes, a saber, no actualizar el campo y establecerlo en 0 .

Si desea mantener el omitempty opciones en los valores de la etiqueta, luego, para que funcione, debe cambiar los campos a punteros:

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 forma en que funciona es que si el puntero es nil , se omitirá (este es el "omiempty" opción). Si el campo no es nil puntero, se actualizará al valor señalado.

Entonces, por ejemplo, si desea excluir un bool campo, luego el *bool el valor debería/será nil . Si desea configurarlo/actualizarlo a false , debe ser un puntero a un false valor. Si desea configurarlo/actualizarlo a true , debe ser un puntero a un true valor.

En general, cualquier tipo cuyo valor cero es posible y debe contarse con él, solo puede manejar el "está siendo el valor cero" y "falta en la entrada" si lo convierte en un puntero, y el nil el valor del puntero denotará el caso "ausente de la entrada", mientras que un valor no nil puntero al valor cero denotará el caso "está siendo el valor cero". Entonces, en el ejemplo anterior, si la string los campos también podrían tomar el valor de la cadena vacía ("" ), entonces también tienes que convertirlos en punteros.

Tenga en cuenta que también puede lograr esto utilizando la lógica personalizada de clasificación y desclasificación, pero eso es más engorroso, y el uso de punteros lo proporciona automáticamente.