【问题标题】:MongoDB GO driver overwriting existing dataMongoDB GO 驱动程序覆盖现有数据
【发布时间】:2022-12-03 04:58:21
【问题描述】:

我正在使用 GO-FIBER 并使用 MONGODB MongoDB Go Driver。 我只想更新正文给出的字段。但它正在覆盖数据。

func UpdateOneUser(c *fiber.Ctx) error {
    params := c.Params("id")
    body := new(models.User)
    
    id, err := primitive.ObjectIDFromHex(params)
    if err != nil {
        return c.Status(500).SendString("invalid onjectid")
    }

    if err := c.BodyParser(&body); err != nil {
        return c.Status(400).SendString("invalid body")
    }
    
    filter := bson.M{"_id": id}
    update := bson.M{"$set": bson.M{
        "name": body.Name,
        "username": body.Username,
        "first_name": body.FirstName,
        "last_name": body.LastName,
        "email": body.Email,
        "phone_number": body.PhoneNumber,
        "contry": body.Contry,
        "age": body.Age,
        "child_accounts": body.ChildAccounts,
        "groups": body.Groups,

    }}
    
    result, err := db.User.UpdateOne(context.Background(), filter, update)
    if err != nil {
        return c.Status(500).SendString("user not found")
    }
    fmt.Println(result)

    return c.JSON(body)

}

如果这是驱动程序的工作方式,请告诉我更新文档的更好方法。

【问题讨论】:

    标签: mongodb go go-fiber


    【解决方案1】:

    $set 运算符将覆盖您指定的所有字段,因此您必须有选择地构建更新语句:

    fields:=bson.M{}
    if body.Name!="" {
       fields["name"]=body.Name
    }
    ...
    update:=bson.M{"$set":fields}
    

    您可以使用一些快捷方式:

    fields:=bson.M{}
    add:=func(key,value string) {
       if value!="" {
          fields[key]=value
       }
    }
    add("name",body.Name)
    add("userName",body.UserName)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2022-08-16
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多