Преди да започнете
Този урок предполага, че имате:
- Основно разбиране на езика Go
- Най-новата версия на GoLang, инсталирана на вашата система
- Последната версия на MongoDB, инсталирана на вашата система
В този урок ще използваме официалния драйвер MongoDB Go за управление на нашата база данни MongoDB. В надлежния процес ще напишем програма, за да научим как да инсталираме MongoDB Go Driver и да изпълняваме CRUD операции с него.
Инсталиране
Първо в празна папка изпълнете командата по-долу
go mod init gomongo
go mod init
създава нов файл go.mod и автоматично импортира зависимости, когато стартирате програмата go. След това създайте файла main.go и напишете кода по-долу. Ще обясним какво ще направи този код след минута.
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")
}
В горния код импортирахме пакетите bson, mongo и mongo/options на mongo-driver и дефинирахме Book
тип, който ще се използва в този урок
Първо в основната функция създадохме clientOptions с URL адрес на MongoDB и идентификационни данни и ги предадохме на mongo.Connect
функция, След като се свържем, можем да проверим връзката си чрез client.Ping
функция.
Следният код ще използва booksCollection
променлива за запитване на books
колекция от testdb.
booksCollection := client.Database("testdb").Collection("books")
Вмъкване на документи
Първо нека създадем структура Book, която да вмъкнем в колекцията, в кода по-долу използваме collection.InsertOne
функция за вмъкване на един документ в колекцията
// 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)
За да вмъкнем няколко документа наведнъж, трябва да създадем отрязък от Book
обект и го предайте на 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)
Актуализиране на документи
Можем да актуализираме един документ чрез функция collection.UpdateOne
. Той изисква филтърен документ, за да съпостави документи в колекцията, и актуализиран документ, за да опише операцията за актуализиране. Можете да ги изградите с помощта на типове bson.D. Кодът по-долу ще съответства на книгата с ISBN 0451526341 и увеличете полето за копия с 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)
Можете също така да актуализирате повече от един документ наведнъж в една колекция чрез функция
collection.UpdateMany
, В него трябва да предадем филтърен документ и да актуализираме документа катоcollection.UpdateOne
Намиране на документи
За да намерим един документ, можем да използваме функцията collection.FindOne()
, ще предадем филтърен документ и ще декодираме резултата в Book
тип променлива
// 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)
За да намерим множество документи, използваме функцията collection.Find()
. Този метод връща курсор, осигурява поток от документи, върху които можем да повторим или можем да получим всички документи чрез функция cursor.All()
в парче от Book
Тип.
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)
Изтриване на документи
Можем да изтрием документи от колекция с помощта на функции collection.DeleteOne()
или collection.DeleteMany()
. Тук предавате bson.D{{}} като аргумент за филтър, който ще съответства на всички документи в колекцията.
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)
Цялата колекция може да бъде премахната с помощта на функцията collection.Drop(), тя ще премахне всички документи и метаданни, като индекси от колекцията
След като извършите цялата операция, не забравяйте да затворите връзката с MongoDB
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")
Сега можете лесно да използвате MongoDB като източник на данни във вашето go приложение, Можете да намерите пълния код, използван в този урок, в нашето Github Repo