登录
首页 >  Golang >  Go问答

使用 Go 更新 MongoDB 中的数组字段

来源:stackoverflow

时间:2024-03-19 23:36:37 433浏览 收藏

在使用 Go 更新 MongoDB 中的数组字段时,需要根据请求内容合并 person 对象。由于 MongoDB 的 $set 运算符会用指定值替换字段值,且无法理解复杂类型的合并,因此需要自定义合并逻辑。当请求中没有提供爱好字段时,合并后的对象不包含该字段,避免更新数据库中的爱好字段。当请求中提供空数组作为爱好字段时,合并后的对象包含空数组,更新数据库中的爱好字段为空。

问题内容

我有这个数据架构:

"person": { "name": "neeraj", "hobbies": ["movies" ] }

这是在 mongodb 中插入文档的结构

type person struct {
  id   primitive.objectid `bson:"_id,omitempty" json:"id,omitempty"`
  name string `bson:"name,omitempty" json:"name,omitempty"`
  hobbies []string `json:"hobbies,omitempty" bson:"hobbies,omitempty"`
}

当在没有爱好字段的情况下调用 put person api 时,我希望它不会更新数据库中的爱好字段。在这种情况下,当我解析正文时,该结构将 hobbies 设置为 null,并且由于“omitempty”bson 标记,它不会更新数据库中的 hobbies 字段,这很好。

filter := bson.d{{"_id", oid}}
update := bson.m{
    "$set": record,
}
result, err := collection.updateone(ctx, filter, update)

但是,当调用 put person api 并将爱好字段设置为空数组时,我希望它更新爱好字段并将其设置为空。但在这种情况下,记录结构体的爱好字段设置为空,并且它不会更新爱好字段。

如何在 go 中执行此操作,以便我的代码满足以下所有更新有效负载?我正在使用 golang 官方 mongo 驱动程序。

{
   "name": "john"  // Should not modify the hobbies field.
}

{
  "name": "john",
  "hobbies": []  // // Should update the hobbies field to an empty array
}

正确答案


听起来您想根据请求中提供的内容合并 person 对象,而 mongodb $set 运算符“用指定值替换字段的值。”因为 mongodb不明白复杂类型应该如何合并,您必须自己指定确切的合并逻辑。

filter := bson.M{"_id": oid}
set := bson.M{
    "name": record.Name,
}
if (record.Hobbies) != nil {
    set["hobbies"] = record.Hobbies
}
update := bson.M{"$set": set}

以上就是《使用 Go 更新 MongoDB 中的数组字段》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>