Skip to content

Instantly share code, notes, and snippets.

@Ja7ad
Last active September 7, 2022 03:59
Show Gist options
  • Save Ja7ad/8e3b855d12cdc2445c3d0eb63b08c7e6 to your computer and use it in GitHub Desktop.
Save Ja7ad/8e3b855d12cdc2445c3d0eb63b08c7e6 to your computer and use it in GitHub Desktop.
mongodb with builder pattern

MongoDB Constructor with Builder Pattern

You can create new object of mongodb client and database

Example

package main

import "log"

var dbClient Connector

func main() {
        con, err := database.NewMongo(context.Background(), "mongodb://localhost:27017")
	   if err != nil {
		   log.Fatalln(err)
	   }
	con.SetDatabase("example")
	dbClient = con
}
package main
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readconcern"
"go.mongodb.org/mongo-driver/mongo/writeconcern"
)
var _ Connector = (*MongoClient)(nil)
type Connector interface {
SetDatabase(string)
GetClient() *mongo.Client
GetDatabase() *mongo.Database
GetCollection(string) *mongo.Collection
NewSession(context.Context, ...*options.SessionOptions) (mongo.SessionContext, error)
StartTransaction(mongo.SessionContext) error
}
type MongoClient struct {
client *mongo.Client
database *mongo.Database
}
func NewMongo(ctx context.Context, uri string, opts ...*options.ClientOptions) (Connector, error) {
opts = append(opts, options.Client().ApplyURI(uri))
cli, err := mongo.NewClient(opts...)
if err != nil {
return nil, err
}
if err := cli.Connect(ctx); err != nil {
return nil, err
}
if err := cli.Ping(ctx, nil); err != nil {
return nil, err
}
return &MongoClient{client: cli}, nil
}
func (m *MongoClient) SetDatabase(dbName string) {
m.database = m.client.Database(dbName)
}
func (m *MongoClient) GetClient() *mongo.Client {
return m.client
}
func (m *MongoClient) GetDatabase() *mongo.Database {
return m.database
}
func (m *MongoClient) GetCollection(collectionName string) *mongo.Collection {
return m.database.Collection(collectionName)
}
func (m *MongoClient) NewSession(ctx context.Context, opts ...*options.SessionOptions) (mongo.SessionContext, error) {
sess, err := m.client.StartSession(opts...)
if err != nil {
return nil, err
}
return mongo.NewSessionContext(ctx, sess), nil
}
func (m *MongoClient) StartTransaction(sessCtx mongo.SessionContext) error {
if err := sessCtx.StartTransaction(options.Transaction().
SetReadConcern(readconcern.Snapshot()).
SetWriteConcern(writeconcern.New(writeconcern.WMajority()))); err != nil {
return err
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment