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