sql >> Base de Datos >  >> NoSQL >> MongoDB

Primeros pasos con el controlador MongoDB Go

En marzo de 2019, se lanzó el controlador GO oficial listo para producción para MongoDB y ha estado recibiendo actualizaciones continuas desde su lanzamiento. En este tutorial, aprenderemos a realizar operaciones MongoDB CRUD simples utilizando el controlador Go.

Requisitos

Se requieren dos cosas antes de comenzar con este tutorial.

  • Go debe estar instalado en su máquina. Para este tutorial se utiliza la versión 1.15 de Go. Puede descargar el paquete Go desde este enlace.
  • Instala la última versión de MongoDB en tu máquina e inicia el servidor local de MongoDB.

Instalación del controlador MongoDB

Instale el controlador MongoDB go ejecutando el siguiente comando:

go get go.mongodb.org/mongo-driver

Si está utilizando módulos Go, cree un archivo go.mod y luego el comando anterior agregará la dependencia requerida en el archivo mod. Este archivo bloquea todos los requisitos del proyecto en su versión correcta.

Configuración del archivo principal

Cree un archivo main.go en la carpeta de su proyecto y ábralo en su IDE. Antes de escribir el código para las operaciones de MongoDB, importemos todos los paquetes necesarios en el archivo.

package main

import (

  "context"

  "fmt"

  "log"



  "go.mongodb.org/mongo-driver/bson"

  "go.mongodb.org/mongo-driver/mongo"

  "go.mongodb.org/mongo-driver/mongo/options"

)

Ahora, cree las siguientes variables globales que usaremos en todas las funciones de operación CRUD.

var client *mongo.Client

var collection *mongo.Collection

var ctx = context.TODO()

Además, cree la estructura para el tipo de documento.

type Person struct {

Name string

Age  int

City string

}

Conectando a MongoDB

Ahora la configuración base está lista. Creemos nuestra primera función para conectarnos a MongoDB.

func connect() *mongo.Client {

  clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

  client, err := mongo.Connect(ctx, clientOptions)

  if err != nil {

       log.Fatal(err)

  }

err = client.Ping(ctx, nil)

  if err != nil {

       log.Fatal(err)

  }

  fmt.Println("Connected to MongoDB!")

  return client

}

Esta función configurará la conexión con nuestro MongoDB que se ejecuta localmente y devolverá el objeto del cliente. Una vez que el método de conexión devuelve el objeto del cliente, podemos usar el método Ping() para verificar si la conexión fue exitosa o no. Si el método Ping() devuelve algún error, podemos generar el error y regresar.

Insertar operación

Para insertar solo un documento, podemos usar el método insertOne y para insertar varios documentos juntos, podemos usar el método insertMany. La siguiente es la función para insertar un documento en la colección Persona:

func insertOne() {

  akash := Person{"Akash", 28, "Bengaluru"}

  res, err := collection. InsertOne (ctx, akash)

  if err != nil {

       log.Fatal(err)

  }

  fmt.Println("Inserted document: ", res.InsertedID)

}

Esta es la función para agregar múltiples documentos a la colección:

func insertMany() {

  akash := Person{"Akash", 28, "Bengaluru"}

  bob := Person {"Bob", 30, "New York"}

  robin := Person {"Robin", 25, "London"}

 

  persons := []interface{}{akash, bob, robin}



  res, err := collection.InsertMany(ctx, persons)

  if err != nil {

       log.Fatal(err)

  }

  fmt.Println("Inserted documents: ", res.InsertedIDs)

}

Para ambas operaciones, necesitamos usar la estructura Person que creamos anteriormente e inicializarla con nuestros datos. Con la función InsertMany, necesitaremos pasar la interfaz de tipo para todos los documentos.

Operación de recuperación

Para encontrar datos de la colección, necesitaremos un filtro aprobado, así que asegúrese de haber importado el paquete bson. Usaremos el tipo bson.D para crear filtros usando objetos bson.

func retrieveOne() {

  var result Person

  filter := bson.D{{"name", "Akash"}}

  err := collection.FindOne(ctx, filter).Decode(&result)

  if err != nil {

       log.Fatal(err)

  }

  fmt.Printf("Found a single document: %+v\n", result)

}

De la misma manera, podemos usar el método Buscar para recuperar todos los documentos coincidentes.

func retrieveAll() {

  findOptions := options.Find()

  findOptions.SetLimit(2)

  var results []*Person

  cur, err := collection.Find(ctx, bson.D{{}}, findOptions)

  if err != nil {

       log.Fatal(err)

  }

  // Loop through the cursor

  for cur.Next(context.TODO()) {

       var elem Person

       err := cur.Decode(&elem)

       if err != nil {

            log.Fatal(err)

       }

       results = append(results, &elem)

  }

  if err := cur.Err(); err != nil {

       log.Fatal(err)

  }

  cur.Close(context.TODO())

}

Puede usar el paquete de opciones para especificar opciones como límite u órdenes.

Operación de actualización

Igual que el método FineOne, para la actualización también puede usar el método UpdateOne con el objeto de filtro bson. Este código actualizará todos los documentos con el nombre Akash y aumentará el valor de Edad en uno.

func update() {

filter := bson.D{{"name", "Akash"}}

update := bson.D{

     {"$inc", bson.D{

         {"Age", 1},

     }},

}

updateResult, err := collection.UpdateOne(context.TODO(), filter, update)

if err != nil {

     log.Fatal(err)

}

fmt.Printf("Updated documents: %+v\n", updateResult)

}

Operación de eliminación

Para eliminar documentos de cualquier colección, puede usar el método DeleteOne o DeleteMany. Aquí también, podemos pasar objetos de filtro bson para que coincidan con los documentos y eliminarlos.

func delete() {

deleteResult, err := collection.DeleteMany(ctx, bson.D{{}})

if err != nil {

     log.Fatal(err)

}

fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)

}

Si pasa el objeto bson.D{{}} como parámetro de filtro, se eliminarán todos los documentos. Puede usar el método collection.Drop() para eliminar toda la colección.

Una vez que todas estas funciones estén listas, puede usarlas en su función de controlador según sus necesidades. Con suerte, esto será suficiente para comenzar a escribir funciones de MongoDB en Go. Para obtener más información, puede consultar la documentación oficial del controlador Go Mongo.