mongodb - 在 go 中更新 MongoDB 数组字段
问题描述
我有这个数据模式:
"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 时,我希望它不会更新 DB 中的爱好字段。在这种情况下,当我解析正文时,结构将爱好设置为 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 字段并将其设置为空。但是在这种情况下,记录结构也将爱好字段设置为空,并且它不会更新爱好字段。
我如何在 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}
推荐阅读
- mpi - 使用 mpirun 运行时未激活 OpenMP 线程
- java - 是否可以在没有信任库的情况下在客户端实现 mTLS?
- azure-devops - Azure DevOps 管道和 Docker
- java - Java Gson 将 Json 对象解析为数组
- android - AndroidX:设置 Enter 键以验证 EditTextPreference 对话框
- ansible - Ansible 从清单中“跳过”最后一个主机
- reactjs - ReactiveSearch 运行保存的查询
- openseadragon - Openseadragon 中的“Book like”视图(几个“2 pages”序列)
- javascript - Python 3 脚本无法打开和关闭浏览器窗口以使用 OAuth API 登录
- jsf - 通过添加自定义 JSF 组件将 CSS 和 JS 文件注入 Html