【问题标题】:Update MongoDB array field in go在 go 中更新 MongoDB 数组字段
【发布时间】:2021-06-05 10:55:44
【问题描述】:

我有这个数据架构:

"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 时,我希望它不会更新数据库中的爱好字段。在这种情况下,当我解析正文时,结构将爱好设置为 null,并且由于 'omitempty' bson 标记,它不会更新 DB 中的爱好字段,这很好。

filter := bson.D{{"_id", oid}}
update := bson.M{
    "$set": record,
}
result, err := collection.UpdateOne(ctx, filter, update)

但是,当调用 PUT person API 并将 hobbies 字段设置为空数组时,我希望它会更新 hobbies 字段并将其设置为空。但是在这种情况下,记录结构也将 hobbies 字段设置为 null,并且它不会更新 hobbies 字段。

如何在 go 中执行此操作,以便我的代码满足所有后续更新负载?我正在使用golang official mongo driver

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

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

【问题讨论】:

  • 我得到了一些帮助,并且能够通过使用 *[]string 类型而不是 []string 来解决此问题。

标签: mongodb go


【解决方案1】:

听起来您想根据请求中提供的内容合并 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}

【讨论】:

  • 我尝试关注,但没有帮助。当我传递空数组时,它不会清除现有值。 update := bson.M{ // "$set": record, "$set": bson.M{ "name": record.Name, }, "$addToSet": bson.M{"hobbies": bson. M{"$each": record.hobbies}}, } result, err := rc.collection.UpdateOne(ctx, filter, update)...我需要的是一种方法来了解 API 是否在没有爱好的情况下被调用或一个空数组(我应该手动检查 json 结构吗?),然后为 DB 更新编写一个通用代码,它适用于 nil 和空数组
  • 啊,对不起,我误解了,我更新了我的答案。是的,您必须手动检查结构并相应地更新您的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多