如何使用Go中的mgo对文档进行部分和完全更新

时间:2016-08-03 15:13:27

标签: mongodb go mgo

来自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)},
},
})

感谢。

1 个答案:

答案 0 :(得分:2)

  1. 是的,部分更新始终需要$set。这不是关于Go这是关于Mongo $set operator bson.M只是map[string]interface{}的快捷方式,它允许我们在不考虑的情况下构建类似JSON的结构参数类型。因此,由于您始终需要$set,因此更新文档始终至少有两个bson.M级别。实际上,还有更多级别,因为您的Task对象也可以定义为bson.M个对象。

  2. 是的,完整的文档更新(我个人认为此过程看起来更像是替换)只需要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})