I want something like this:
old_record
new_record
old_record
I write code like this:
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
but, I think find
and update
should be an atomic
operation, so my code is not safe.
how can I do this in an atomic operation
The method here is .Apply()
which takes a Change type and returns ChangeInfo.
Direct example in the documentation:
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)
Where doc
is document that is found, and it's state depending on the value of ReturnNew
in the Change
arguments, being false
where you want the original document.
Basically all arguments are in the same form as with .findAndModify()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With