如何使用 golang 在 mongodb 中找到并修改一条记录?
how can I findAndModify one record in mongodb with golang?
我想要这样的东西:
- 在 mongo 数据库中找到一条记录
old_record
- 更新此记录为
new_record
- return
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
操作,所以我的代码不安全。
如何在原子操作中执行此操作
这里的方法是.Apply()
which takes a Change type and returns 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
是找到的文档,它的状态取决于 Change
参数中 ReturnNew
的值,即 false
您想要原始文件的位置文档。
基本上所有参数的形式都与 .findAndModify()
相同
我想要这样的东西:
- 在 mongo 数据库中找到一条记录
old_record
- 更新此记录为
new_record
- return
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
操作,所以我的代码不安全。
如何在原子操作中执行此操作
这里的方法是.Apply()
which takes a Change type and returns 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
是找到的文档,它的状态取决于 Change
参数中 ReturnNew
的值,即 false
您想要原始文件的位置文档。
基本上所有参数的形式都与 .findAndModify()