mongo.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package database
  2. import (
  3. "context"
  4. "fmt"
  5. zapLogger "fwh-toolbox-server/logger"
  6. "time"
  7. "go.mongodb.org/mongo-driver/mongo"
  8. "go.mongodb.org/mongo-driver/mongo/options"
  9. "go.mongodb.org/mongo-driver/x/mongo/driver/connstring"
  10. )
  11. var MongoClient *mongo.Client
  12. var MongoDb *mongo.Database
  13. func InitMongo(uri string) (*mongo.Client, error) {
  14. databaseName, err := parseMongoDatabaseName(uri)
  15. if err != nil {
  16. return nil, err
  17. }
  18. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  19. defer cancel()
  20. client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
  21. if err != nil {
  22. zapLogger.Sugar.Errorln("Mongo connect error: ", err)
  23. return nil, err
  24. }
  25. if err := client.Ping(ctx, nil); err != nil {
  26. zapLogger.Sugar.Errorln("Mongo ping error: ", err)
  27. return nil, err
  28. }
  29. MongoClient = client
  30. MongoDb = client.Database(databaseName)
  31. zapLogger.Sugar.Infoln("MongoDB connected, database: ", databaseName)
  32. return client, nil
  33. }
  34. func parseMongoDatabaseName(uri string) (string, error) {
  35. cs, err := connstring.ParseAndValidate(uri)
  36. if err != nil {
  37. return "", fmt.Errorf("parse MongoDB URI: %w", err)
  38. }
  39. if cs.Database == "" {
  40. return "", fmt.Errorf("MongoDB URI must contain a database name")
  41. }
  42. return cs.Database, nil
  43. }
  44. func GetCollection(collName string) *mongo.Collection {
  45. return MongoDb.Collection(collName)
  46. }