go - 避免在数据库中保存空白结构对象

标签 go mgo

我正在运行以下代码。当用户保存在 db 中然后保存空白地址时,我在保存之前将空结构分配给地址。我无法在地址结构的所有字段中添加 omitempty。我如何避免在用户集合中保存空白地址对象

    package main

import (
    "context"
    "fmt"
    "time"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type User struct {
    Id          int           `json:"id" bson:"_id,omitempty"`
    FirstName   string        `json:"first_name,omitempty" bson:"first_name,omitempty"`
    LastName    string        `json:"last_name,omitempty" bson:"last_name,omitempty"`
    FullName    string        `json:"full_name,omitempty" bson:"full_name,omitempty"`
    CompanyName string        `json:"company_name" bson:"company_name"`
    Address     AddressStruct `json:"address,omitempty" bson:"address,omitempty"`
}
type AddressStruct struct {
    Address      string `json:"address" bson:"address"`
    City         string `json:"city" bson:"city"`
    State        string `json:"state" bson:"state"`
    Zipcode      string `json:"zipcode" bson:"zipcode"`
    Apt          string `json:"apt" bson:"apt"`
    Default      bool   `json:"default" bson:"default"`
    Status       int8   `json:"status,omitempty" bson:"status,omitempty"`
    Country      string `json:"country,omitempty" bson:"country,omitempty"`
    ShortAddress string `json:"short_address" bson:"short_address"`
}

func main() {
    var user User
    user.FirstName = "Swati"
    user.LastName = "Sharma"
    user.FullName = "Swati Sharma"
    user.Address = AddressStruct{}
    client, ctx := ConnectDbWithNewDriver()
    defer client.Disconnect(ctx)
    a, b := DbInsertOne(client, user)
    fmt.Println("Section1", a, b)
}
func ConnectDbWithNewDriver() (client *mongo.Client, ctx context.Context) {
    ctx = context.Background()
    client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://127.0.0.1:27017").SetConnectTimeout(5*time.Second))
    if err != nil {
        fmt.Println("CreateSession: ", err)
        client.Disconnect(ctx)
        return
    }
    return
}
func DbInsertOne(client *mongo.Client, data interface{}) (interface{}, error) {
    collection := client.Database("swatitest").Collection("users")
    insertResult, err := collection.InsertOne(context.TODO(), data)
    if err != nil {
        return nil, err
    }
    return insertResult.InsertedID, nil
}

当我运行此代码时,记录会像这样保存在数据库中:

{
    "_id" : ObjectId("61af41b32214b16fe93435a6"),
    "first_name" : "Swati",
    "last_name" : "Sharma",
    "full_name" : "Swati Sharma",
    "company_name" : "",
    "address" : {
        "address" : "",
        "city" : "",
        "state" : "",
        "zipcode" : "",
        "apt" : "",
        "default" : false,
        "short_address" : ""
    }
}

我想保存如下:

{
        "_id" : ObjectId("61af41b32214b16fe93435a6"),
        "first_name" : "Swati",
        "last_name" : "Sharma",
        "full_name" : "Swati Sharma",
        "company_name" : ""
}

最佳答案

您可以使用 omitempty bson 标签选项,所有 Go 驱动程序都会处理它并且如果它的值为零值(对于原始类型)则不会保存该字段。

因此将它添加到所有您不想保存为空字符串的字段:

type AddressStruct struct {
    Address      string `json:"address" bson:"address,omitempty"`
    City         string `json:"city" bson:"city,omitempty"`
    State        string `json:"state" bson:"state,omitempty"`
    Zipcode      string `json:"zipcode" bson:"zipcode,omitempty"`
    Apt          string `json:"apt" bson:"apt,omitempty"`
    Default      bool   `json:"default" bson:"default,omitempty"`
    Status       int8   `json:"status,omitempty" bson:"status,omitempty"`
    Country      string `json:"country,omitempty" bson:"country,omitempty"`
    ShortAddress string `json:"short_address" bson:"short_address,omitempty"`
}

如果你不能修改结构类型,那么就不要保存结构值。创建您自己的类型(在其中添加 omitempty),将结构值复制到其中,然后保存您自己的副本。

关于go - 避免在数据库中保存空白结构对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70259520/

相关文章:

google-app-engine - 添加 *datastore.Key 到 slice

Golang,数学/大 : what is the max value of *big. Int

go - 从 Golang 中的函数列表中选择一个函数

database - MongoDB 获取集合中的所有文档使用 mgo 给出一个空的结构片段

mongodb - 如何更新子文档数组字段以及 Mongodb、Mgo 中的其他一些字段?

json - go 中的 JSON panic

go - 使用 Go-Colly 抓取时删除空行

templates - 如何在 Go 中使用 Blackfriday 将 markdown 渲染为 html?

mongodb - 如何通过 mgo (golang) 创建哈希索引

mongodb - Golang mgo MongoDB bson.ObjectId 非 utf-8 错误