6

私はこのようなものが欲しい:

  1. mongo dbで1つのレコードを見つけるold_record
  2. この記録を次のように更新しますnew_record
  3. 戻る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と思うので、私のコードは安全ではありません。updateatomic

アトミック操作でこれを行うにはどうすればよいですか

4

1 に答える 1

16

ここでのメソッドは、 Change.Apply()を取り、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の値に応じて、元のドキュメントが必要な場所になります。ReturnNewChangefalse

基本的にすべての引数は with と同じ形式です.findAndModify()

于 2015-08-11T09:04:33.757 に答える