2019年3月,釋出了適用於MongoDB的正式的可用於生產環境的GO驅動程式,該驅動程式自發布以來一直在持續更新。在本教程中,我們將學習使用Go驅動程式執行簡單的MongoDB CRUD操作。
環境準備在開始本教程之前,需要做兩件事。
Go應該安裝在您的機器上。本教程使用Go 1.15版。您可以從此連結下載Go軟體包。在您的電腦上安裝最新版本的MongoDB並啟動MongoDB的本地伺服器。安裝MongoDB驅動程式透過執行以下命令來安裝MongoDB go驅動程式:
go get go.mongodb.org``/mongo-driver
如果您正在使用Go Modules,則建立一個go.mod檔案,然後上述命令將在mod檔案中新增所需的依賴項。該檔案將所有專案要求鎖定為正確的版本。
設定主檔案在您的專案資料夾中建立一個檔案main.go,然後在您的IDE中開啟它。在編寫用於MongoDB操作的程式碼之前,讓我們將所有必需的包匯入檔案中。
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" )
現在,建立以下全域性變數,我們將在所有CRUD操作函式中使用這些全域性變數。
var client *mongo.Client var collection *mongo.Collection var ctx = context.TODO()
此外,建立文件型別的結構。
ype Person struct { Name string Age int City string }
連線到MongoDB現在基本設定已準備就緒。讓我們建立第一個函式以連線到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 }
此函式將建立與我們本地執行的MongoDB的連線,並返回客戶端物件。一旦connect方法返回了客戶端物件,我們就可以使用Ping()方法檢查連線是否成功。如果Ping()方法返回任何錯誤,我們可以引發錯誤並返回。
插入操作要只插入一個文件,可以使用insertOne方法,而要一起插入多個文件,可以使用insertMany方法。以下是在“個人”集合中插入一個文件的功能:
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) }
這是將多個文件新增到集合的功能:
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) }
對於這兩個操作,我們都需要使用之前建立的Person結構,並使用我們的資料對其進行初始化。使用InsertMany函式,我們將需要為所有文件傳遞型別介面。
檢索操作為了從集合中查詢資料,我們將需要透過過濾器,因此請確保已匯入bson包。我們將使用bson.D型別使用bson物件建立過濾器。
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) }
同樣,我們可以使用Find方法檢索所有匹配的文件。
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()) }
您可以使用選項包來指定諸如限價或訂單之類的選項。
更新操作與FineOne方法相同,要進行更新,也可以將UpdateOne方法與bson過濾器物件一起使用。此程式碼將更新所有名稱為Akash的文件,並將Age的值增加一。
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) }
刪除操作要從任何集合中刪除文件,可以使用DeleteOne或DeleteMany方法。同樣,在這裡,我們可以傳遞bson過濾器物件以匹配文件並刪除它們。
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) }
如果將bson.D {{}}物件作為過濾器引數傳遞,則它將刪除所有文件。您可以使用collection.Drop()方法刪除整個集合。
所有這些功能準備就緒後,您可以根據需要在驅動程式功能中使用它們。希望這足以使您開始使用Go編寫MongoDB函式。有關更多資訊,您可以參考Go Mongo驅動程式的官方文件。