sql >> Databáze >  >> NoSQL >> MongoDB

Použití MongoDB jako zdroje dat v GoLang

Než začnete

Tento tutoriál předpokládá, že máte:

  • Základní znalost jazyka Go
  • Nejnovější verze GoLang nainstalovaná ve vašem systému
  • Nejnovější verze MongoDB nainstalovaná ve vašem systému

V tomto tutoriálu použijeme oficiální Ovladač MongoDB Go ke správě naší databáze MongoDB. V patřičném procesu napíšeme program, který se naučí, jak nainstalovat ovladač MongoDB Go Driver a provádět s ním operace CRUD.

Instalace

Nejprve v prázdné složce spusťte níže uvedený příkaz

go mod init gomongo

go mod init vytvoří nový soubor go.mod a automaticky importuje závislosti, když spustíte program go. Poté vytvořte soubor main.go a napište níže uvedený kód. Vysvětlíme, co tento kód udělá za minutu.

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

// Book - We will be using this Book type to perform crud operations
type Book struct {
  Title     string
  Author    string
  ISBN      string
  Publisher string
  Copies     int
}

func main() {
    
  // Set client options
  clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

  // Connect to MongoDB
  client, err := mongo.Connect(context.TODO(), clientOptions)

  if err != nil {
    log.Fatal(err)
  }

  // Check the connection
  err = client.Ping(context.TODO(), nil)

  if err != nil {
    log.Fatal(err)
  }

  fmt.Println("Connected to MongoDB!")
  booksCollection := client.Database("testdb").Collection("books")
}

Do výše uvedeného kódu jsme importovali balíčky bson, mongo a mongo/options mongo-driver a definovali Book typ, který bude použit v tomto tutoriálu

V hlavní funkci jsme nejprve vytvořili clientOptions s MongoDB URL a přihlašovacími údaji a předali je mongo.Connect Po připojení můžeme zkontrolovat naše připojení pomocí client.Ping funkce.

Následující kód bude používat booksCollection proměnnou pro dotaz na books sběr z testdb.

booksCollection := client.Database("testdb").Collection("books")

Vložit dokumenty

Nejprve vytvoříme strukturu knihy, kterou vložíme do kolekce, v níže uvedeném kódu používáme collection.InsertOne funkce pro vložení jednoho dokumentu do kolekce

// Insert One document
book1 := Book{"Animal Farm", "George Orwell", "0451526341", "Signet Classics", 100}
insertResult, err := booksCollection.InsertOne(context.TODO(), book1)
if err != nil {
    log.Fatal(err)
}

fmt.Println("Inserted a single document: ", insertResult.InsertedID)

Chcete-li vložit více dokumentů najednou, musíme vytvořit řez Book objekt a předejte jej do collection.InsertMany

// Insert multiple documents
book2 := Book{"Super Freakonomics", "Steven D. Levitt", "0062312871", "HARPER COLLINS USA", 100}
book3 := Book{"The Alchemist", "Paulo Coelho", "0062315005", "HarperOne", 100}
multipleBooks := []interface{}{book2, book3}

insertManyResult, err := booksCollection.InsertMany(context.TODO(), multipleBooks)
if err != nil {
    log.Fatal(err)
}

fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)

Aktualizovat dokumenty

Pomocí funkce collection.UpdateOne můžeme aktualizovat jeden dokument . Vyžaduje dokument filtru, aby odpovídal dokumentům v kolekci, a aktualizovaný dokument k popisu operace aktualizace. Můžete je vytvořit pomocí typů bson.D. Níže uvedený kód bude odpovídat kódu knihy ISBN 0451526341 a zvětšete pole kopií o 10

//Update one document
filter := bson.D{{"isbn", "0451526341"}}

update := bson.D{
    {"$inc", bson.D{
        {"copies", 10},
    }},
}

updateResult, err := booksCollection.UpdateOne(context.TODO(), filter, update)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)

Můžete také aktualizovat více než jeden dokument najednou v jedné kolekci pomocí funkce collection.UpdateMany , V něm musíme předat filtrační dokument a aktualizovat dokument stejně jako collection.UpdateOne

Najít dokumenty

K nalezení jednoho dokumentu můžeme použít funkci collection.FindOne() , předáme dokument filtru a dekódujeme výsledek v Book zadejte proměnnou

// A variable in which result will be decoded
var result Book

err = booksCollection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
    log.Fatal(err)
}

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

K vyhledání více dokumentů používáme funkci collection.Find() . Tato metoda vrací kurzor, poskytuje proud dokumentů, na kterých můžeme iterovat nebo můžeme získat všechny dokumenty funkcí cursor.All() v části Book typ.

cursor, err := booksCollection.Find(context.TODO(), bson.D{{}})
if err != nil {
  log.Fatal(err)
}
var books []Book
if err = cursor.All(context.TODO(), &books); err != nil {
  log.Fatal(err)
}
fmt.Printf("Found multiple documents: %+v\n", books)

Smazat dokumenty

Dokumenty z kolekce můžeme odstranit pomocí funkcí collection.DeleteOne() nebo collection.DeleteMany() . Zde předáte bson.D{{}} jako argument filtru, který bude odpovídat všem dokumentům v kolekci.

deleteCollection, err := booksCollection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the books collection\n", deleteCollection.DeletedCount)

Celou kolekci lze zrušit pomocí funkce collection.Drop(), odstraní z kolekce všechny dokumenty a metadata, jako jsou indexy

Jakmile provedete všechny operace, nezapomeňte ukončit připojení MongoDB

err = client.Disconnect(context.TODO())

if err != nil {
    log.Fatal(err)
}

fmt.Println("Connection to MongoDB closed.")

Nyní můžete snadno používat MongoDB jako zdroj dat ve vaší aplikaci go. Kompletní kód použitý v tomto tutoriálu najdete na našem Github Repo


  1. Mongodb Agregation Framework | Seskupit více hodnot?

  2. Typovaný klient Redis

  3. Použití S3 jako databáze vs. databáze (např. MongoDB)

  4. "Pole vyžadovalo fazoli typu, který nebylo možné najít." error spring restful API pomocí mongodb