我希望得到这样的结果:
- 在MongoDB中查找一条记录
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
但是,我认为查找
和更新
应该是一种原子操作
,因此我的代码不安全。
如何在一个原子操作中完成这个操作?
limit(1)
替换One(obj)
吗? - rogerChange
集合的.Apply()
是原子性的,而你的代码不是。这就是我在这里解决的问题。没有.One()
调用。这个方法“只”一次修改一个文档。这就是mgo版本的.findAndModify()
,这也是你所问的问题。 - Blakes Seven.findAndModify()
方法会做你问题所问的事情。你不能同时修改“n”条记录并一次性返回它们。MongoDB没有这种方法,因为这根本没有意义。要么一个一个用.findAndModify()
,要么一次性使用.update()
。但是对于多个记录,你不能返回修改后或原始数据。那是一个单独的查询。 - Blakes Seven