MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come aggiornare i campi Mongodb con il flag omitempty nella struttura di Golang

Un valore di bool type ha 2 possibili valori:false e true . E vuoi "comunicare" 3 stati diversi con un bool field, ovvero non aggiornare il campo, impostare il campo su false e per impostare il campo su true . Questo ovviamente non è possibile.

Stessa cosa vale per int valori:un valore di 0 non può rappresentare 2 scelte diverse, ovvero non aggiornare il campo e impostarlo a 0 .

Se vuoi mantenere l'omitempty opzioni nei valori dei tag, quindi per farlo funzionare, devi cambiare i campi in puntatori:

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

Il modo in cui funziona è che se il puntatore è nil , verrà omesso (questo è il "omitempty" opzione). Se il campo non è nil puntatore, verrà aggiornato al valore indicato.

Quindi, ad esempio, se vuoi escludere un bool campo, quindi il *bool il valore dovrebbe / sarà nil . Se vuoi impostarlo / aggiornarlo su false , deve essere un puntatore a un false valore. Se vuoi impostarlo / aggiornarlo su true , deve essere un puntatore a un true valore.

In generale, qualsiasi tipo il cui valore zero è possibile e dovrebbe essere contato, puoi gestire solo "è il valore zero" e "manca dall'input" se lo rendi un puntatore e nil il valore del puntatore indicherà il caso "mancante dall'input", mentre un non nil il puntatore al valore zero indicherà il caso "è il valore zero". Quindi nell'esempio sopra se la string i campi possono anche assumere il valore di una stringa vuota ("" ), quindi devi renderli anche dei puntatori.

Tieni presente che puoi raggiungere questo obiettivo anche utilizzando la logica di marshalling e unmarshalling personalizzata, ma è più complicato e l'utilizzo dei puntatori lo fornisce automaticamente.