sql >> データベース >  >> NoSQL >> MongoDB

GoでMongoDB接続を再利用する方法

    私はこのようにします。サービスの開始時に1回実行してから、MongoDatastoreオブジェクトをオーケストレーター、サービスレイヤー、およびリポジトリレイヤーに渡します。私はmongoに「github.com/mongodb/mongo-go-driver/mongo」ドライバーを使用しています。アイドル状態の接続を内部で監視してリサイクルしていると思います。したがって、mongo.Clientオブジェクトへの参照が失われない限り、接続の切断について気にする必要はありません。

    
    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
    }
    
    

    これで、次のようにリポジトリを作成できます。-

    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. マングース:アトミックFindOne-Or-Insert()、見つかった場合は既存のインスタンスを更新しない

    2. データソースの自動構成に失敗しました:'spring.datasource.url'が指定されていません

    3. クエリ結果セットに*変更*のストリームを提供できるNoSQLデータベースがある場合はどれですか?

    4. ジャーナリングを制御するためのsmallfilesオプションを設定しても、サイズは制御されません