Как найти и изменить одну запись в mongodb с помощью golang?
Я хочу что-то вроде этого:
- найти одну запись в монго дб
old_record
- обновить эту запись, чтобы
new_record
- вернуть
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()