Как найти и изменить одну запись в mongodb с помощью golang?

Я хочу что-то вроде этого:

  1. найти одну запись в монго дб old_record
  2. обновить эту запись, чтобы new_record
  3. вернуть old_record

Я пишу код так:

ret = nil
// First, Find the obj
obj := &orm.QuerySetObj{}
err2 := this.querySetCollection.With(session).Find(objKey).One(obj)
if nil != err2 {
    this.logger.Println("Error find obj")
    return
}

ret = obj

// Then, update this obj
obj.updateTime = time.Now().Unix()
err3 := this.querySetCollection.With(session).Upsert(objKey, obj)
if nil != err3 {
    this.logger.Println("Error update obj")
    return
}

return

но я думаю find а также update должен быть atomic операция, поэтому мой код не является безопасным.

как я могу сделать это в атомарной операции

1 ответ

Решение

Метод здесь .Apply() который принимает тип Change и возвращает ChangeInfo.

Прямой пример в документации:

change := mgo.Change{
        Update: bson.M{"$inc": bson.M{"n": 1}},
        ReturnNew: false,
}
info, err = col.Find(M{"_id": id}).Apply(change, &doc)
fmt.Println(doc.N)

куда doc это документ, который найден, и его состояние в зависимости от значения ReturnNew в Change аргументы, будучи false где вы хотите оригинальный документ.

В основном все аргументы в той же форме, что и с .findAndModify()

Другие вопросы по тегам