我想要这样的事情:
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
操作,所以我的代码不安全。
如何在原子操作中执行此操作
答案 0 :(得分:15)
此处的方法为.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()