MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách sử dụng lại kết nối MongoDB trong Go

Tôi làm theo cách này. Làm điều đó một lần khi bắt đầu dịch vụ và sau đó chuyển đối tượng MongoDatastore xung quanh đến trình điều phối, các lớp dịch vụ và các lớp kho lưu trữ. Tôi đang sử dụng trình điều khiển "github.com/mongodb/mongo-go-driver/mongo" cho mongo. Tôi nghĩ rằng nó giám sát nội bộ và tái chế các kết nối nhàn rỗi. Do đó, chúng tôi không phải bận tâm về các kết nối bị hỏng miễn là tham chiếu đến đối tượng mongo.Client không bị mất.


const CONNECTED = "Successfully connected to database: %v"

type MongoDatastore struct {
    db      *mongo.Database
    Session *mongo.Client
    logger  *logrus.Logger
}

func NewDatastore(config config.GeneralConfig, logger *logrus.Logger) *MongoDatastore {

    var mongoDataStore *MongoDatastore
    db, session := connect(config, logger)
    if db != nil && session != nil {

        // log statements here as well

        mongoDataStore = new(MongoDatastore)
        mongoDataStore.db = db
        mongoDataStore.logger = logger
        mongoDataStore.Session = session
        return mongoDataStore
    }

    logger.Fatalf("Failed to connect to database: %v", config.DatabaseName)

    return nil
}

func connect(generalConfig config.GeneralConfig, logger *logrus.Logger) (a *mongo.Database, b *mongo.Client) {
    var connectOnce sync.Once
    var db *mongo.Database
    var session *mongo.Client
    connectOnce.Do(func() {
        db, session = connectToMongo(generalConfig, logger)
    })

    return db, session
}

func connectToMongo(generalConfig config.GeneralConfig, logger *logrus.Logger) (a *mongo.Database, b *mongo.Client) {

    var err error
    session, err := mongo.NewClient(generalConfig.DatabaseHost)
    if err != nil {
        logger.Fatal(err)
    }
    session.Connect(context.TODO())
    if err != nil {
        logger.Fatal(err)
    }

    var DB = session.Database(generalConfig.DatabaseName)
    logger.Info(CONNECTED, generalConfig.DatabaseName)

    return DB, session
}

Bây giờ bạn có thể tạo kho lưu trữ của mình như sau:-

type TestRepository interface{
    Find(ctx context.Context, filters interface{}) []Document, error
}

type testRepository struct {
    store      *datastore.MongoDatastore
}

func (r *testRepository) Find(ctx context.Context , filters interface{}) []Document, error{
    cur, err := r.store.GetCollection("some_collection_name").Find(ctx, filters)
    if err != nil {
        return nil, err
    }
    defer cur.Close(ctx)
    var result = make([]models.Document, 0)
    for cur.Next(ctx) {
        var currDoc models.Document
        err := cur.Decode(&currDoc)
        if err != nil {
            //log here
            continue
        }
        result = append(result, currDoc)
    }
    return result, err
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tôi muốn kết quả có giá trị khác biệt của một trường từ mongodb bằng cách sử dụng dữ liệu mùa xuân

  2. Cách thích hợp để xử lý các thay đổi lược đồ trong MongoDB với trình điều khiển java

  3. Tham gia hai bộ sưu tập trong MongoDB

  4. Làm cách nào để xóa các trường không dùng nữa trong Mongo?

  5. Đặt nhiều trường với một truy vấn cập nhật