如何使用golang在mongodb中找到并修改一条记录?

时间:2015-08-11 08:52:24

标签: mongodb go atomic findandmodify

我想要这样的事情:

  1. 在mongo db old_record
  2. 中找到一条记录
  3. 将此记录更新为new_record
  4. return old_record
  5. 我写这样的代码:

    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
    

    但是,我认为findupdate应该是atomic操作,所以我的代码不安全。

    如何在原子操作中执行此操作

1 个答案:

答案 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()

的形式相同