官方mongo-go-driver使用会话

时间:2019-02-11 09:37:02

标签: mongodb go

是否有使用gogo官方mongodb驱动程序进行会话的示例?我正在尝试使用会话来利用事务,似乎只是在github上阅读测试,我找不到解决方法。

更具体地说,我现在正在为此努力:

session, err := pool.StartSession()                                              
   if err != nil {                                                                  
     log.Println("Could not create db session", err)                                
     return events.APIGatewayProxyResponse{                                         
       Body:       err.Error(),                                                     
       StatusCode: http.StatusInternalServerError,                                  
     }, err                                                                         
   }                                                                                
   ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)          
   defer cancel()                                                                   
   defer session.EndSession(ctx)                                                    

    var db *mongo.Database                                                           

上面的代码一切正常,但是当我这样做时:

  

db = session.Database("testrest")

它给出了错误:

  

session.Database未定义(类型mongo.Session没有字段或方法   数据库)

哪个似乎可以与mgo软件包一起使用...我如何选择数据库并通过会话运行查询?

1 个答案:

答案 0 :(得分:3)

找到我的问题的解决方案:https://github.com/simagix/mongo-go-examples/blob/master/examples/transaction_test.go#L68

if session, err = client.StartSession(); err != nil {
        t.Fatal(err)
    }
    if err = session.StartTransaction(); err != nil {
        t.Fatal(err)
    }
    if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
        if result, err = collection.UpdateOne(sc, bson.M{"_id": id}, update); err != nil {
            t.Fatal(err)
        }
        if result.MatchedCount != 1 || result.ModifiedCount != 1 {
            t.Fatal("replace failed, expected 1 but got", result.MatchedCount)
        }

        if err = session.AbortTransaction(sc); err != nil {
            t.Fatal(err)
        }
        return nil
    }); err != nil {
        t.Fatal(err)
    }
    session.EndSession(ctx)