golang mongo-driver 如何更新某个字段

2021-01-24 18:12:45 +08:00
 aoscici

type Comment struct {
	ID      primitive.ObjectID `bson:"_id,omitempty"  json:"id"`
	Title   string             `bson:"title"          json:"title"       binding:"required"`
	Author  string             `bson:"author"         json:"author"      binding:"required"`
	Content string             `bson:"content"        json:"content"     binding:"required"`
	Like    int64              `bson:"like"           json:"like"`
	Updated time.Time          `bson:"updated"        json:"updated"`
}

Collection.FindOneAndUpdate(ctx, filter, update, &opt).Decode(&comment)

比如这里我只传来 {"content": "。。。"} 或者 {"author": "11"} 这一个数据,怎么灵活得接收这个数据和只更新这一个字段?翻了很多文章貌似都是把更新项写死的。

1810 次点击
所在节点    Go 编程语言
9 条回复
teawithlife
2021-01-24 18:56:16 +08:00
我不确定是否有这样的功能,但是从道理上来说,一个 API 的设计,需要更新哪些字段应该是明确的,不应该随意变化。所以我怀疑你这是一个 XY 问题,可否先讲讲你这个需求产生的原因?
lithiumii
2021-01-24 19:06:28 +08:00
直接{'$set':{'content': '...'}}就行了吧,没涉及的字段不会变
aoscici
2021-01-24 19:12:07 +08:00
@teawithlife 比如说我就单独更新一下个人信息的年龄,或者单独更新性别,不知道该怎么操作
aoscici
2021-01-24 19:26:48 +08:00
@lithiumii 主要是我想能不能单独传一个字段进来,就更新这个字段,而不是所有 required 的字段都要传
bankroft
2021-01-24 19:42:50 +08:00
接收 bson.M,set bsonM 不行吗
useben
2021-01-24 23:59:54 +08:00
外部传入 map[string]interface{}参数, 内部创建 bson.M,遍历 map[string]interface{}赋值 bson.M, 最后 set bsonM
yeqown
2021-01-25 09:06:43 +08:00
@useben 这种方式可行, 补充一点:不推荐直接使用 map[string]interface{} ,可以考虑从模型 struct 转过来,那样就不用关心数据库里字段名是什么了
useben
2021-01-25 09:44:34 +08:00
@yeqown 也可以
aoscici
2021-01-25 14:11:55 +08:00
@useben 谢谢,看着可行哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX