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ě jakocollection.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