来自Shiju Varghese的Web开发,关于Go中MongoDB驱动程序mgo
中的更新方法
更新文件
Collection类型的Update方法允许您 更新现有文件。这是方法签名 更新方法:
func (c *Collection) Update(selector interface{}, update interface{}) error
Update方法从集合中查找匹配的单个文档 它使用提供的选择器文档,并根据它修改它 提供了更新文件。部分更新可以通过使用 更新文档中的关键字“$ set”。
清单8-14更新现有文档。
err := c.Update(bson.M{"_id": id}, bson.M{"$set": bson.M{ "description": "Create open-source projects", "tasks": []Task{ Task{" Evaluate Negroni Project", time.Date(2015, time.August, 15, 0, 0, 0, 0, time.UTC)}, Task{" Explore mgo Project", time.Date(2015, time.August, 10, 0, 0, 0, 0, time.UTC)}, Task{" Explore Gorilla Toolkit", time.Date(2015, time.August, 10, 0, 0, 0, 0, time.UTC)}, }, }})
对字段的描述和任务执行部分更新。 Update方法查找具有提供的_id值的文档 根据提供的文档修改字段。
该示例是部分更新。它使用两级嵌套bson.M
来创建update interface{}
。部分更新是否始终使用这种两级嵌套bson.M
?
完整更新是否使用单级bson.M
,例如
err := c.Update(bson.M{"_id": id}, bson.M{ "description": "Create open-source projects", "tasks": []Task{ Task{" Evaluate Negroni Project", time.Date(2015, time.August, 15, 0, 0, 0, 0, time.UTC)}, Task{" Explore mgo Project", time.Date(2015, time.August, 10, 0, 0, 0, 0, time.UTC)}, Task{" Explore Gorilla Toolkit", time.Date(2015, time.August, 10, 0, 0, 0, 0, time.UTC)}, }, })
感谢。
答案 0 :(得分:2)
是的,部分更新始终需要$set
。这不是关于Go这是关于Mongo $set operator bson.M
只是map[string]interface{}
的快捷方式,它允许我们在不考虑的情况下构建类似JSON的结构参数类型。因此,由于您始终需要$set
,因此更新文档始终至少有两个bson.M
级别。实际上,还有更多级别,因为您的Task
对象也可以定义为bson.M
个对象。
是的,完整的文档更新(我个人认为此过程看起来更像是替换)只需要2个bson.M
个对象 - 查询和新文档。
在Mongo中,完整更新看起来像
db.collection.update({_id: "id"}, {name: "name", num: 1})
Go中的相同命令:
c.Update(bson.M{"_id": "id"}, bson.M{"name": "name", "num": 1})