MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So aktualisieren Sie Mongodb-Felder mit dem Auslassungs-Flag in der Golang-Struktur

Ein Wert von bool type hat 2 mögliche Werte:false und true . Und Sie möchten 3 verschiedene Zustände mit einem bool "kommunizieren". Feld, nämlich um das Feld nicht zu aktualisieren, um das Feld auf false zu setzen und um das Feld auf true zu setzen . Dies ist offensichtlich nicht möglich.

Dasselbe gilt für int Werte:ein Wert von 0 kann nicht 2 verschiedene Möglichkeiten darstellen, nämlich das Feld nicht zu aktualisieren und es auf 0 zu setzen .

Wenn Sie die omitempty beibehalten möchten Optionen in den Tag-Werten, dann müssen Sie, damit es funktioniert, die Felder in Zeiger ändern:

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

Es funktioniert folgendermaßen, wenn der Zeiger nil ist , wird es weggelassen (das ist die "Auslassung" Möglichkeit). Wenn das Feld nicht nil ist Zeiger, wird er auf den angezeigten Wert aktualisiert.

Also zum Beispiel, wenn Sie einen bool ausschließen möchten Feld, dann *bool value sollte / wird nil sein . Wenn Sie es auf false setzen/aktualisieren möchten , muss es ein Zeiger auf false sein Wert. Wenn Sie es auf true setzen/aktualisieren möchten , muss es ein Zeiger auf true sein Wert.

Im Allgemeinen jeder Typ, dessen Nullwert ist möglich ist und damit gerechnet werden sollte, können Sie nur mit "es ist der Nullwert" und "es fehlt in der Eingabe" umgehen, wenn Sie daraus einen Zeiger machen, und den nil Der Wert des Zeigers zeigt den Fall "Fehlt in der Eingabe" an, während er nicht nil ist Zeiger auf den Nullwert bezeichnet den Fall "es ist der Nullwert". Also im obigen Beispiel wenn der string Felder könnten auch den leeren Zeichenfolgenwert ("") annehmen ), dann musst du sie auch zu Zeigern machen.

Beachten Sie, dass Sie dies auch mit benutzerdefinierter Marshalling- und Unmarshaling-Logik erreichen können, aber das ist umständlicher, und die Verwendung von Zeigern gibt Ihnen dies automatisch.