In maart 2019 werd de officiële, productieklare GO-driver voor MongoDB uitgebracht en deze ontvangt vanaf de lancering continue updates. In deze zelfstudie leren we eenvoudige MongoDB CRUD-bewerkingen uit te voeren met behulp van het Go-stuurprogramma.
Vereisten
Er zijn twee dingen vereist voordat we met deze tutorial beginnen.
- Go moet op je computer zijn geïnstalleerd. Go versie 1.15 wordt gebruikt voor deze tutorial. Je kunt het Go-pakket downloaden via deze link.
- Installeer de nieuwste versie van MongoDB op uw computer en start de lokale server van MongoDB.
Installatie van het MongoDB-stuurprogramma
Installeer het MongoDB go-stuurprogramma door de volgende opdracht uit te voeren:
go get go.mongodb.org/mongo-driver
Als je Go Modules gebruikt, maak dan een go.mod-bestand aan en dan zal de bovenstaande opdracht de vereiste afhankelijkheid in het mod-bestand toevoegen. Dit bestand vergrendelt alle projectvereisten naar de juiste versie.
Het hoofdbestand instellen
Maak een bestand main.go in je projectmap en open het in je IDE. Voordat we de code voor MongoDB-bewerkingen schrijven, moeten we alle benodigde pakketten in het bestand importeren.
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"
)
Maak nu de volgende globale variabelen die we zullen gebruiken voor alle CRUD-bewerkingsfuncties.
var client *mongo.Client
var collection *mongo.Collection
var ctx = context.TODO()
Maak ook de structuur voor het documenttype.
type Person struct {
Name string
Age int
City string
}
Verbinding maken met MongoDB
Nu is de basisconfiguratie klaar. Laten we onze eerste functie maken om verbinding te maken met 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
}
Deze functie zal de verbinding opzetten met onze lokaal draaiende MongoDB en het client-object retourneren. Zodra de connect-methode het client-object retourneert, kunnen we de Ping()-methode gebruiken om te controleren of de verbinding succesvol was of niet. Als de methode Ping() een fout retourneert, kunnen we de fout verhogen en terugkeren.
Invoegbewerking
Om slechts één document in te voegen, kunnen we de methode insertOne gebruiken en om meerdere documenten samen in te voegen, kunnen we de methode insertMany gebruiken. Hieronder volgt de functie voor het invoegen van één document in de Persoonsverzameling:
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)
}
Hier is de functie om meerdere documenten aan de verzameling toe te voegen:
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)
}
Voor beide bewerkingen moeten we Person struct gebruiken die we eerder hebben gemaakt en deze initialiseren met onze gegevens. Met de functie InsertMany moeten we de type-interface voor alle documenten doorgeven.
Ophaalbewerking
Voor het vinden van gegevens uit de collectie hebben we een pass-filter nodig, dus zorg ervoor dat je het bson-pakket hebt geïmporteerd. We zullen het type bson.D gebruiken om filters te maken met behulp van bson-objecten.
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)
}
Op dezelfde manier kunnen we de Find-methode gebruiken om alle overeenkomende documenten op te halen.
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())
}
U kunt het optiepakket gebruiken om opties zoals limiet of bestellingen op te geven.
Bewerking bijwerken
Hetzelfde als de FineOne-methode, voor update kunt u ook de UpdateOne-methode gebruiken met het bson-filterobject. Deze code werkt alle documenten bij met de naam Akash en verhoogt de waarde van Age met één.
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)
}
Bewerking verwijderen
Voor het verwijderen van documenten uit een verzameling kunt u de methode DeleteOne of DeleteMany gebruiken. Ook hier kunnen we bson-filterobjecten doorgeven om de documenten te matchen en ze te verwijderen.
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)
}
Als u het bson.D{{}}-object als filterparameter doorgeeft, worden alle documenten verwijderd. U kunt de methode collection.Drop() gebruiken om de hele verzameling te verwijderen.
Zodra al deze functies gereed zijn, kunt u ze naar behoefte in uw driverfunctie gebruiken. Hopelijk is dit voldoende om u op weg te helpen met het schrijven van MongoDB-functies in Go. Raadpleeg de officiële documentatie voor de Go Mongo-driver voor meer informatie.