sql >> Database teknologi >  >> NoSQL >> MongoDB

Kom godt i gang med MongoDB Go-driveren

I marts 2019 blev den officielle, produktionsklare GO-driver til MongoDB frigivet, og den har modtaget løbende opdateringer fra lanceringen. I denne øvelse lærer vi at udføre simple MongoDB CRUD-operationer ved hjælp af Go-driver.

Forudsætninger

To ting kræves, før vi starter med denne øvelse.

  • Go skal være installeret på din maskine. Go version 1.15 bruges til denne øvelse. Du kan downloade Go-pakken fra dette link.
  • Installer den seneste version af MongoDB på din maskine og start MongoDBs lokale server.

Installation af MongoDB-driveren

Installer MongoDB go-driveren ved at køre følgende kommando:

go get go.mongodb.org/mongo-driver

Hvis du bruger Go-moduler, så opret en go.mod-fil, og så tilføjer ovenstående kommando den nødvendige afhængighed i mod-filen. Denne fil låser alle projektkrav til dens korrekte version.

Opsætning af hovedfilen

Opret en fil main.go i din projektmappe og åbn den i din IDE. Før vi skriver koden til MongoDB-operationer, lad os importere alle de nødvendige pakker i filen.

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"

)

Opret nu følgende globale variabler, som vi vil bruge på tværs af alle CRUD-operationsfunktionerne.

var client *mongo.Client

var collection *mongo.Collection

var ctx = context.TODO()

Opret også strukturen for dokumenttype.

type Person struct {

Name string

Age  int

City string

}

Opretter forbindelse til MongoDB

Nu er basisopsætningen klar. Lad os oprette vores første funktion til at oprette forbindelse til 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

}

Denne funktion opsætter forbindelsen til vores lokalt kørende MongoDB og returnerer klientobjektet. Når først forbindelsesmetoden returnerer klientobjektet, kan vi bruge Ping()-metoden til at kontrollere, om forbindelsen var vellykket eller ej. Hvis Ping()-metoden returnerer en fejl, kan vi hæve fejlen og returnere.

Indsæt handling

For kun at indsætte ét dokument, kan vi bruge insertOne-metoden og for at indsætte flere dokumenter sammen, kan vi bruge insertMany-metoden. Følgende er funktionen til at indsætte ét dokument i personsamlingen:

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)

}

Her er funktionen til at tilføje flere dokumenter til samlingen:

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)

}

For begge operationer skal vi bruge Person struct, som vi oprettede tidligere, og initialisere den med vores data. Med funktionen InsertMany skal vi bestå typegrænsefladen for alle dokumenter.

Hent handling

For at finde data fra samlingen kræver vi et pass-filter, så sørg for at du har importeret bson-pakken. Vi vil bruge typen bson.D til at oprette filtre ved hjælp af bson-objekter.

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)

}

På samme måde kan vi bruge Find-metoden til at hente alle de matchende dokumenter.

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())

}

Du kan bruge indstillingspakken til at angive muligheder som grænse eller ordrer.

Opdater handling

Samme som FineOne-metoden, til opdatering kan du også bruge UpdateOne-metoden med bson filterobjekt. Denne kode vil opdatere alle dokumenter med navnet Akash og øge værdien af ​​Alder med én.

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)

}

Slet handling

For at slette dokumenter fra enhver samling kan du bruge enten DeleteOne- eller DeleteMany-metoden. Også her kan vi sende bson-filterobjekter til at matche dokumenterne og slette dem.

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)

}

Hvis du sender bson.D{{}} objekt som en filterparameter, vil det slette alle dokumenter. Du kan bruge metoden collection.Drop() til at slette hele samlingen.

Når alle disse funktioner er klar, kan du bruge dem i din driverfunktion efter dit behov. Forhåbentlig vil dette være nok til at få dig i gang med at skrive MongoDB-funktioner i Go. For mere information kan du henvise til den officielle dokumentation for Go Mongo-driveren.


  1. Er der forskel på to lister?

  2. Returnere begrænset antal poster af en bestemt type, men ubegrænset antal andre poster?

  3. Parse ISO8601-datostrengen til dato med UTC-tidszone

  4. Sådan bruger du ActionController::Live sammen med Resque + Redis (til chatapplikation)