Официальный Mongo-Go-драйвер с использованием сессий - PullRequest
0 голосов
/ 11 февраля 2019

Есть ли пример использования сеансов с официальным драйвером mongodb для golang?Я пытаюсь использовать сессии, чтобы извлечь выгоду из транзакций, и кажется, что, просто читая тесты на 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 undefined (тип mongo.Session не имеет поля или метода Database)

Что, похоже, работает с пакетом mgo… Как выбрать базу данных и выполнить запросы с сеансом?

1 Ответ

0 голосов
/ 12 февраля 2019

Решение моей проблемы было найдено здесь: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...