2016-08-03 24 views
1

從轉到Web開發由石咀Varghese表示一個文件,關於MongoDB的驅動mgo更新方法如何去做部分和全部更新使用氧化鎂圍棋

更新文檔

集合類型的更新方法允許您 更新現有文檔。這裏是 更新方法的方法簽名:

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

感謝。

回答

2
  1. 是的,部分更新始終需要$set。這不是關於Go這是關於Mongo的$set operatorbson.M只是map[string]interface{}的快捷方式,它允許我們在不考慮參數類型的情況下構建類似JSON的結構。因此,因爲您始終需要$set更新文檔始終至少有兩個級別bson.M。實際上,您的Task對象也可以定義爲bson.M對象,因此存在更多級別。

  2. 是的,完整的文檔更新(我個人認爲這個過程看起來更像是替換)只需要2個bson.M對象 - 查詢和新文檔。

    在蒙戈完全更新看起來像

    db.collection.update({_id: "id"}, {name: "name", num: 1})

    而在同一命令:

    c.Update(bson.M{"_id": "id"}, bson.M{"name": "name", "num": 1})