To jest samouczek wprowadzający do podstawowych operacji MongoDB z perspektywy języka Golang.
Uwaga: Ten samouczek korzysta z oficjalnego pakietu sterownika języka Go dostarczonego przez MongoDB.
Wymagane samouczki
Uwaga: Jeśli nie znasz MongoDB, najpierw zapoznaj się z wiedzą na temat MongoDB. Samouczek Golang nie będzie powtarzał odpowiedniej wiedzy.
Podstawowe wymagania
- Go 1.10 lub nowszy
- MongoDB 2.6 lub nowszy
Instalacja zależności
go get go.mongodb.org/mongo-driver/mongo
Połączenie z MongoDB
import (
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
// Adres połączenia z MongoDB
uri := "mongodb://localhost:27017"
// Uzyskanie obiektu kontekstu, można ustawić limit czasu
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Połączenie z MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
Funkcja Connect nie blokuje gorutyny. To znaczy, że bezpośrednie operowanie na MongoDB po wywołaniu metody Connect może skutkować błędem, ponieważ MongoDB nie nawiązał jeszcze połączenia. Można skorzystać z metody Ping, aby sprawdzić, czy połączenie z MongoDB nawiązało się pomyślnie.
// Ping MongoDB, jeśli połączenie nawiązało się pomyślnie, nie zostanie zwrócony żaden błąd
err = client.Ping(ctx, readpref.Primary())
Adres Połączenia z MongoDB
Adres połączenia z MongoDB zawiera ważne informacje, takie jak adres serwera, numer portu, konto i hasło. Format jest następujący:
mongodb://[nazwaużytkownika:hasło@]host1[:port1][,...hostN[:portN]][/[domyślna_baza][?opcje]]
Przykład:
// Połączenie z adresem localhost:27017 z domyślną nazwą użytkownika i hasłem
mongodb://localhost:27017
// Połączenie z adresem localhost:27017 z kontem=root, hasłem=123456 oraz połączenie z domyślną bazą danych=admin
mongodb://root:123456@localhost:27017/admin
Zwolnienie Zasobów Połączenia
Jeśli połączenie nie jest już potrzebne, należy ręcznie zwolnić zasoby połączenia.
defer func() {
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()
Pobranie Instancji Kolekcji
Aby operować na MongoDB w języku Golang, należy najpierw uzyskać instancję kolekcji, a następnie można wykonywać operacje CRUD na instancji kolekcji.
// Ustaw nazwę bazy danych za pomocą Database, a nazwę kolekcji za pomocą Collection
collection := client.Database("testing").Collection("numbers")
Uwaga: Zgodnie z charakterystyką MongoDB, nie trzeba tworzyć bazy danych i kolekcji z góry. Będą one tworzone automatycznie przy pierwszym zapisie danych.
Wstaw dokument
Do wstawiania danych użyj funkcji InsertOne.
// Obiekt kontekstu, często używany do ustawiania limitu czasu żądania, można również ponownie użyć obiektu kontekstu utworzonego wcześniej, nie trzeba go ponownie definiować
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Wstawianie dokumentu, tutaj używamy typu bson.D do opisania dokumentu JSON, bson.D reprezentuje tablicę JSON
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
// Pobierz id nowo dodanego dokumentu
id := res.InsertedID
Należy zaimportować następujące pakiety:
import (
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
Uwaga: W języku Golang pakiet bson jest używany do reprezentowania struktury danych dokumentu JSON. W kolejnych rozdziałach zostanie szczegółowo opisane wyrażanie struktur przechowywania danych MongoDB w języku Golang.
package main
import (
"context"
"fmt"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
func main() {
// Ustaw adres połączenia z MongoDB
uri := "mongodb://root:123456@localhost:27017/admin"
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Połączenie z MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
// Zwolnij połączenie z opóźnieniem
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()
// Sprawdź, czy połączenie z MongoDB jest udane
if err := client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
}
fmt.Println("Połączenie z MongoDB udane!")
// Pobierz kolekcję numbers
collection := client.Database("testing").Collection("numbers")
// Wstaw dokument
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
id := res.InsertedID
fmt.Println("Id nowego dokumentu =", id)
}