2016-08-03 7 views
1

С веб-разработки с Go по Shiju Varghese, о способе обновления в драйвере MongoDB mgo в GoКак сделать частичные и полные обновления на документе с использованием MgO в Go

Обновление документов

Метод обновления типа Collection позволяет вам обновлять существующие документы . Вот метод подпись методы Update:

func (c *Collection) Update(selector interface{}, update interface{}) error 

Метод обновление находит один документ из коллекции, спички его с помощью прилагаемого документа селектора, и изменяет его на основе предоставленного документа обновления . Частичное обновление может быть выполнено с помощью ключевого слова «$ 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 this about about 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})

    И той же команды в Go:

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