¿Cómo conectar Go a Mongo? 🍃

19 de Julio del 2022 ¿Ves algún error? Corregir artículo golang-wallpaper

Una de las bases de datos más populares en la actualidad es Mongo sin embargo es más conocida en el mundo de JavaScript en Go las bases de datos que suelen utilizarse son PostgreSQL y MySQL, en este artículo aprenderemos como conectarnos a una base de datos de Mongo desde Go.

Estructura de archivos

Para este tutorial organizaremos nuestras fuentes de datos en la carpeta repositorios. Los demás archivos estarán ubicados en su posición normal.

config

config.go

repositories

mongo.go

config.json

.gitignore

go.mod

main.go

Dentro de la carpeta repositorio estaría también la conexión con Redis si la tuviésemos o a una base de datos relacional como MySQL.

En un siguiente artículo entraremos más a detalle haciendo un CRUD con Go, Fiber y Mongo.

💡Tip: Al empezar un proyecto nuevo en Go

go mod init github.com/tuUsuario/elNombreDeTuCarpeta

Creando nuestro archivo de configuración

Con Mongo tenemos la opción de conectarnos usando un URL, dentro de este vienen distintos parámetros como usuario, contraseña, servidor, etc.

Podemos abordar el archivo de configuración usando los distintos parámetros por separado o usando solo la URL de conexión.

Para este artículo usaremos solo la URL para simplificar lo más que podamos y concentrarnos en realizar la conexión.

~
{ "mongo_conn": "https://🤫.com" }

Obteniendo la configuración desde el archivo config.json hacia Go

Para este ejemplo usaremos nuestro servicio de configuración explicado en el artículo donde aprendemos a traer variables de configuración desde archivos JSON.

~
package config import ( "encoding/json" "os" ) type Config struct { MongoConn string `json:"mongo_conn"` } type ConfigService struct { Config Config FilePath string } func (s *Service) GetMongoConn() string { return s.Config.MongoConn } func (s *ConfigService) LoadConfigJSON() error { configuration := Config{} configFile, err := os.Open("./config.json") if err != nil { return err } jsonParser := json.NewDecoder(configFile) if err = jsonParser.Decode(&configuration); err != nil { return err } s.Config = configuration return nil } func NewConfigService(path string ) *Service { return &Service{ FilePath:path, } }

Implementando nuestra conexión a Mongo

Primero instalemos el Mongo Driver que es el paquete oficial de Mongo.

~
go get go.mongodb.org/mongo-driver/mongo

Una buena forma de empezar la conexión a Mongo es al momento de crear la instancia de este repositorio Mongo en el código podrás ver como en la función creadora se inicializa la conexión hacia Mongo.

~
package repositories import ( "context" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" ) type MongoHandler struct { Client *mongo.Client Config *config.ConfigService } func NewMongoHandler(config config.ConfigService) *MongoHandler{ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client, err := mongo.Connect(ctx, options.Client().ApplyURI(config.GetMongoConn())) return &MongoHandler{ Client: client, Config: config, } func (m *MongoHandler) CheckConnection() { err := client.Ping(ctx, readpref.Primary()) if err != nil { panic(err) } } func (m *MongoHandler) Disconnect() { err := client.Disconnect(ctx); if err != nil { panic(err) } }

Usando nuestra implementación

Ahora podremos usar nuestra base de datos en otros servicios por ahora comprobaremos la conexión en main.go

~
package main import ( "github.com/solrac97gr/go-mongo-conn/config" "github.com/solrac97gr/go-mongo-conn/repositories" ) func main() { configService := config.NewConfigService("./config.json") mongoHandler := repositories.NewMongoHandler(configService) defer mongoHandler.Disconnect() mongoHandler.CheckConnection() }

Detalles adicionales

Podemos crear distintos bases de datos de esta forma creando una interfaz que indique que cada base de datos debe tener los métodos Disconnect y CheckConnection y usar todos los métodos que necesitamos para que así nuestros servicios puedan cambiar de base de datos de manera modular.

Conviértete en un Go Ninja 🥷.Suscríbete a mi newsletter y recibe las últimas novedades en Go.