V březnu 2019 byl vydán oficiální ovladač GO pro MongoDB připravený k produkci a od svého spuštění dostává průběžné aktualizace. V tomto tutoriálu se naučíme provádět jednoduché operace MongoDB CRUD pomocí ovladače Go.
Předpoklady
Před zahájením tohoto výukového programu jsou vyžadovány dvě věci.
- Na vašem počítači by měla být nainstalována aplikace Go. Pro tento tutoriál je použita verze Go 1.15. Balíček Go si můžete stáhnout z tohoto odkazu.
- Nainstalujte si na svůj počítač nejnovější verzi MongoDB a spusťte místní server MongoDB.
Instalace ovladače MongoDB
Nainstalujte ovladač MongoDB go spuštěním následujícího příkazu:
go get go.mongodb.org/mongo-driver
Pokud používáte moduly Go, vytvořte soubor go.mod a výše uvedený příkaz přidá do souboru mod požadovanou závislost. Tento soubor uzamkne všechny požadavky projektu na správnou verzi.
Nastavení hlavního souboru
Vytvořte soubor main.go ve složce projektu a otevřete jej ve svém IDE. Než napíšeme kód pro operace MongoDB, importujme do souboru všechny potřebné balíčky.
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"
)
Nyní vytvořte následující globální proměnné, které budeme používat ve všech funkcích operace CRUD.
var client *mongo.Client
var collection *mongo.Collection
var ctx = context.TODO()
Vytvořte také strukturu pro typ dokumentu.
type Person struct {
Name string
Age int
City string
}
Připojování k MongoDB
Nyní je základní nastavení připraveno. Pojďme vytvořit naši první funkci pro připojení k 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
}
Tato funkce nastaví spojení s naším lokálně spuštěným MongoDB a vrátí objekt klienta. Jakmile metoda connect vrátí objekt klienta, můžeme pomocí metody Ping() zkontrolovat, zda bylo připojení úspěšné nebo ne. Pokud metoda Ping() vrátí jakoukoli chybu, můžeme chybu vyvolat a vrátit se.
Operace vložení
Pro vložení pouze jednoho dokumentu můžeme použít metodu insertOne a pro vložení více dokumentů dohromady můžeme použít metodu insertMany. Následuje funkce pro vložení jednoho dokumentu do kolekce Osoba:
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)
}
Zde je funkce pro přidání více dokumentů do sbírky:
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)
}
Pro obě operace musíme použít strukturu Person, kterou jsme vytvořili dříve, a inicializovat ji našimi daty. S funkcí InsertMany budeme vyžadovat předání rozhraní typu pro všechny dokumenty.
Operace načtení
Pro vyhledání dat z kolekce budeme vyžadovat filtr, takže se ujistěte, že jste importovali balíček bson. K vytvoření filtrů pomocí objektů bson použijeme typ bson.D.
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)
}
Stejným způsobem můžeme použít metodu Najít k načtení všech odpovídajících dokumentů.
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())
}
Balíček možností můžete použít ke specifikaci možností, jako je limit nebo příkazy.
Provoz aktualizace
Stejné jako metoda FineOne, pro aktualizaci také můžete použít metodu UpdateOne s objektem filtru bson. Tento kód aktualizuje všechny dokumenty se jménem Akash a zvýší hodnotu věku o jeden.
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)
}
Odstranit operaci
Pro odstranění dokumentů z libovolné kolekce můžete použít metodu DeleteOne nebo DeleteMany. Zde také můžeme předat objekty filtru bson, aby odpovídaly dokumentům, a odstranit je.
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)
}
Pokud předáte objekt bson.D{{}} jako parametr filtru, smaže se všechny dokumenty. K odstranění celé kolekce můžete použít metodu collection.Drop().
Jakmile jsou všechny tyto funkce připraveny, můžete je použít ve funkci ovladače podle svých potřeb. Doufejme, že to bude stačit k tomu, abyste mohli začít s psaním funkcí MongoDB v Go. Další informace naleznete v oficiální dokumentaci ovladače Go Mongo.