nimo-shake/common/mongodb_community.go (49 lines of code) (raw):

package utils import ( "context" "fmt" LOG "github.com/vinllen/log4go" "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/readpref" ) type MongoCommunityConn struct { Client *mongo.Client URL string ctx context.Context } func NewMongoCommunityConn(url string, connectMode string, timeout bool) (*MongoCommunityConn, error) { clientOps := options.Client().ApplyURI(url) clientOps.SetReadConcern(readconcern.New(readconcern.Level("local"))) // read pref if mode, err := readpref.ModeFromString(connectMode); err != nil { return nil, fmt.Errorf("create connectMode[%v] failed: %v", connectMode, err) } else if opts, err := readpref.New(mode); err != nil { return nil, fmt.Errorf("new mode with connectMode[%v] failed: %v", connectMode, err) } else { clientOps.SetReadPreference(opts) } // set timeout if !timeout { clientOps.SetConnectTimeout(0) } // create default context ctx := context.Background() // connect client, err := mongo.NewClient(clientOps) if err != nil { return nil, fmt.Errorf("new client failed: %v", err) } if err := client.Connect(ctx); err != nil { return nil, fmt.Errorf("connect to %s failed: %v", BlockMongoUrlPassword(url, "***"), err) } // ping if err = client.Ping(ctx, clientOps.ReadPreference); err != nil { return nil, fmt.Errorf("ping to %v failed: %v", BlockMongoUrlPassword(url, "***"), err) } LOG.Info("New session to %s successfully", BlockMongoUrlPassword(url, "***")) return &MongoCommunityConn{ Client: client, URL: url, }, nil } func (conn *MongoCommunityConn) Close() { LOG.Info("Close client with %s", BlockMongoUrlPassword(conn.URL, "***")) conn.Client.Disconnect(conn.ctx) }