MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como atualizar campos Mongodb com sinalizador omitempty na estrutura Golang


Um valor de bool type tem 2 valores possíveis:false e true . E você quer "comunicar" 3 estados diferentes com um bool campo, ou seja, para não atualizar o campo, para definir o campo para false e para definir o campo como true . Isso obviamente não é possível.

A mesma coisa vale para int valores:um valor de 0 não pode representar 2 escolhas diferentes, ou seja, não atualizar o campo e defini-lo como 0 .

Se você quiser manter o omitempty opções nos valores da tag, então para que funcione, você deve alterar os campos para ponteiros:
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"`
}

A maneira como funciona é que, se o ponteiro for nil , ele será deixado de fora (este é o "omitempty" opção). Se o campo não for nil ponteiro, ele será atualizado para o valor apontado.

Por exemplo, se você deseja excluir um bool campo, então o *bool o valor deve/será nil . Se você deseja definir/atualizá-lo para false , deve ser um ponteiro para um false valor. Se você deseja definir/atualizá-lo para true , deve ser um ponteiro para um true valor.

Em geral, qualquer tipo cujo valor zero é possível e deve ser contado, você só pode lidar com o "está sendo o valor zero" e "está faltando na entrada" se você fizer um ponteiro, e o nil valor do ponteiro denotará o caso "ausente da entrada", enquanto um não-nil ponteiro para o valor zero denotará o caso "está sendo o valor zero". Portanto, no exemplo acima, se a string campos também podem receber o valor de string vazio ("" ), então você também deve torná-los ponteiros.

Observe que você também pode conseguir isso usando a lógica de empacotamento e desempacotamento personalizados, mas isso é mais complicado e o uso de ponteiros fornece isso automaticamente.