Prima di iniziare
Questo tutorial presuppone che tu abbia:
- Una conoscenza di base di Go Language
- Ultima versione di GoLang installata sul tuo sistema
- Ultima versione di MongoDB installata sul tuo sistema
In questo tutorial utilizzeremo il Driver MongoDB Go ufficiale per gestire il nostro database MongoDB. A tempo debito, scriveremo un programma per imparare come installare MongoDB Go Driver ed eseguire operazioni CRUD con esso.
Installazione
Innanzitutto in una cartella vuota esegui il comando seguente
go mod init gomongo
go mod init
crea un nuovo file go.mod e importa automaticamente le dipendenze quando esegui il programma go. Quindi crea il file main.go e scrivi il codice seguente, ti spiegheremo cosa farà questo codice in un minuto.
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")
}
Nel codice sopra, abbiamo importato i pacchetti bson, mongo e mongo/options di mongo-driver e definito un Book
tipo che verrà utilizzato in questo tutorial
Nella funzione principale prima, abbiamo creato clientOptions con l'URL e le credenziali MongoDB e lo abbiamo passato a mongo.Connect
funzione, una volta connessi possiamo controllare la nostra connessione tramite client.Ping
funzione.
Il codice seguente utilizzerà booksCollection
variabile per interrogare i books
raccolta da testdb.
booksCollection := client.Database("testdb").Collection("books")
Inserisci documenti
Per prima cosa creiamo una struttura Book da inserire nella collezione, nel codice sottostante stiamo usando collection.InsertOne
funzione per inserire un unico documento nella collezione
// 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)
Per inserire più documenti contemporaneamente dobbiamo creare una fetta di Book
oggetto e passalo a 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)
Aggiorna documenti
Possiamo aggiornare un singolo documento tramite la funzione collection.UpdateOne
. Richiede un documento filtro per abbinare i documenti nella raccolta e un documento aggiornato per descrivere l'operazione di aggiornamento. Puoi costruirli usando i tipi bson.D. Il codice seguente corrisponderà al libro con ISBN 0451526341 e incrementa il campo delle copie di 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)
Puoi anche aggiornare più di un documento contemporaneamente in una singola raccolta tramite la funzione collection.UpdateMany
, In esso, dobbiamo passare il documento filtro e aggiornare il documento come collection.UpdateOne
Trova documenti
Per trovare un singolo documento, possiamo usare la funzione collection.FindOne()
, passeremo un documento filtro e decodificheremo il risultato nel Book
tipo variabile
// 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)
Per trovare più documenti, utilizziamo la funzione collection.Find()
. Questo metodo restituisce un cursore, fornisce un flusso di documenti su cui possiamo iterare o possiamo ottenere tutti i documenti tramite la funzione cursor.All()
in una fetta di Book
genere.
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)
Elimina documenti
Possiamo eliminare documenti da una raccolta usando le funzioni collection.DeleteOne()
o collection.DeleteMany()
. Qui passi bson.D{{}} come argomento del filtro, che corrisponderà a tutti i documenti nella raccolta.
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)
L'intera raccolta può essere eliminata utilizzando la funzione collection.Drop(), rimuoverà tutti i documenti e i metadati, come gli indici, dalla raccolta
Una volta eseguite tutte le operazioni, non dimenticare di chiudere la connessione MongoDB
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")
Ora puoi facilmente utilizzare MongoDB come Datasource nella tua applicazione go, puoi trovare il codice completo utilizzato in questo tutorial sul nostro Github Repo