首页 > 解决方案 > 如何在 UpdateOne 语句中做“省略”

问题描述

我在正文中收到了一些字段,但我有以下代码:

    registro := bson.M{
        "$set": bson.M{
            "nombre":          b.Nombre,
            "apellidos":       b.Apellidos,
            "fechaNacimiento": b.FechaNacimiento,
            "email":           b.Email,
            "password":        passwordEncriptada,
            "avatar":          b.Avatar,
            "banner":          b.Banner,
            "biografia":       b.Biografia,
            "domicilio":       b.Domicilio,
            "sitioWeb":        b.SitioWeb,
        },
    }

    objID, _ := primitive.ObjectIDFromHex(ID)
    filtro := bson.M{"_id": bson.M{"$eq": objID}}

    _, err := col.UpdateOne(ctx, filtro, registro)
    if err != nil {
        return false, err
    }

这会导致 MongoDB 文档中的所有字段,但其中一些字段是空的。

我该怎么omitemptyUpdateOne()

问候

标签: mongodbgo

解决方案


如何在 UpdateOne() 期间进行省略?

您可以在传递到更新语句之前构建一个结构。update 语句在通过之前会经过bson.Marshal()。例如,如果您有以下结构:

type Test struct {
    Banner string      `json:"banner" bson:"banner,omitempty"`
    Email  string      `json:"email" bson:"email,omitempty"`
    Avatar string      `json:"avatar" bson:"avatar,omitempty"`
    Age    int32       `json:"age" bson:"age,omitempty"`
}

您可以构造更新的结构,如下所示:

filter := bson.M{}
foo := Test{Banner:"updated", Avatar:"updated", Email:"", Age:0}
statement := bson.M{"$set": foo}
result, err := collection.UpdateOne(ctx, filter, statement)

更新操作后,EmailAge字段的值不应更新。


推荐阅读