sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man uppdaterar Mongodb-fält med utelämnande flagga i Golang-struktur

Värdet bool typen har 2 möjliga värden:false och true . Och du vill "kommunicera" 3 olika tillstånd med en bool fältet, nämligen att inte uppdatera fältet, att ställa in fältet till false och för att ställa in fältet till true . Detta är uppenbarligen inte möjligt.

Samma sak gäller för int värden:ett värde på 0 kan inte representera 2 olika val, nämligen att inte uppdatera fältet och att ställa in det på 0 .

Om du vill behålla omitempty alternativ i taggvärdena, för att få det att fungera måste du ändra fälten till pekare:

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

Sättet det fungerar är att om pekaren är nil , kommer den att utelämnas (detta är "oaktsamhet" alternativ). Om fältet är ett icke-nil pekaren kommer den att uppdateras till det spetsiga värdet.

Så till exempel om du vill utesluta en bool och sedan *bool värdet bör / kommer att vara nil . Om du vill ställa in / uppdatera den till false , måste det vara en pekare till en false värde. Om du vill ställa in / uppdatera den till true , måste det vara en pekare till en true värde.

I allmänhet alla typer vars nollvärde är möjligt och bör räknas med, kan du bara hantera "det är nollvärdet" och "det saknas i ingången" om du gör det till en pekare, och nil värdet på pekaren kommer att beteckna fallet "saknas från ingången", medan ett icke-nil pekaren till nollvärdet kommer att beteckna fallet "det är nollvärdet". Så i exemplet ovan om string fält kan också ta det tomma strängvärdet ("" ), då måste du också göra dem pekare.

Observera att du också kan uppnå detta genom att använda anpassad logik för rangordning och uppdelning, men det är mer besvärligt, och att använda pekare ger dig detta automatiskt.



  1. Förhindra Spring Data för Mongo att konvertera ID till ObjectId

  2. CouchDB vs MongoDB (minnesanvändning)

  3. Ignorera specialtecken före matchningsvillkor

  4. MongoDB ReplicaSet - PRIMÄR-rollen faller till SEKUNDÄR när endast PRIMÄR är kvar