欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言使用MongoDB數(shù)據(jù)庫詳細(xì)步驟

 更新時間:2024年05月22日 08:56:35   作者:白如意i  
mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計算領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于Go語言使用MongoDB數(shù)據(jù)庫的詳細(xì)步驟,需要的朋友可以參考下

MongoDB 安裝(Docker)

先裝個 mongo,為了省事就用 docker 了。

docker 的 daemon.json 加一個國內(nèi)的源地址:

"registry-mirrors": [
    "http://hub-mirror.c.163.com"
]

然后拉取 mongo 鏡像:

docker pull mongodb

啟動 mongo:

docker run -p 27017:27017 mongo

安裝 MongoDB Go 驅(qū)動

go get go.mongodb.org/mongo-driver

基礎(chǔ)代碼

創(chuàng)建 main.go 文件,并且導(dǎo)入 bson,mongo 和 mongo/options 包。

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

// 在后面的代碼中將會使用這個 Trainer 結(jié)構(gòu)體
type Trainer struct {
    Name string
    Age  int
    City string
}

func main() {
    // 
}

使用 Go Driver 連接到 MongoDB

一旦 MongoDB 的 Go 驅(qū)動被導(dǎo)入之后,我們就可以使用 mongo.Connect 函數(shù)來連接到 MongoDB。你必須傳遞一個 context 和 options.ClientOptions 對象給 mongo.Connect 函數(shù)。options.ClientOptions 被用來設(shè)置連接配置。

// 設(shè)置連接參數(shù)
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

// 連接到 MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)

if err != nil {
    log.Fatal(err)
}

// 檢查連接
err = client.Ping(context.TODO(), nil)

if err != nil {
    log.Fatal(err)
}

fmt.Println("Connected to MongoDB!")

一旦你連接上了 MongoDB,你現(xiàn)在可以獲取 test 數(shù)據(jù)庫的 trainers 集合。

collection := client.Dataabse("test").Collection("trainers")

下面的代碼將會使用 collection 來查詢 trainers 集合。

如果你不在需要查詢 MongoDB,就可以使用 client.Disconnect() 來關(guān)閉 MongoDB 連接。

err = client.Disconnect(context.TODO())

if err != nil {
    log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")

在 Go 里面使用 BSON 對象

在發(fā)送查詢請求到 MongoDB 之前,了解如何使用 BSON 對象是非常有必要的。在 MongoDB 中存儲的 JSON 文檔叫 BSON,是以二進制形式存儲的。不像其他數(shù)據(jù)庫以字符串形式存儲 JSOn 數(shù)據(jù),BSON 還包含了字段類型,這使得應(yīng)用程序更容易可靠地處理、排序和比較。Go 的 MongoDB 驅(qū)動有兩個表示 BSON 數(shù)據(jù)的類型:D 類型和 Raw 類型。

D 類型用于使用 Go 中的原始類型來構(gòu)建 BSON 對象。這對于傳遞給 MongoDB 的命令特別有用。D 類型包括四種類型:

  • D:一個 BSON 文檔。

  • M:無序的 map。

  • A:一個 BSON 數(shù)組。

  • E:D 里面的單個元素。

這里是一個使用 D 類型篩選文檔的例子,這里會篩選出名字為 Alice 或者 Bob 的數(shù)據(jù):

bson.D({
    "name",
    bson.D{
        {"$in": bson.A{"Alice", "Bob"}}
    }
})

CRUD 操作

一旦你連接到了數(shù)據(jù)庫,我們就可以開始添加或者操作數(shù)據(jù)庫中的數(shù)據(jù)了。Collection 類型有一些方法允許你發(fā)送查詢到數(shù)據(jù)庫中。

插入文檔

首先,創(chuàng)建一些新的 Trainer 結(jié)構(gòu)體來插入到數(shù)據(jù)庫中:

ash := Trainer{"Ash", 10, "Pallet Town"}
misty := Trainer{"Misty", 10, "Cerulean City"}
brock := Trainer{"Brock", 15, "Pewter" City}

可以使用 collection.InsertOne() 方法來插入單個文檔:

insertResult, err := collection.InsertOne(context.TODO(), ash)
if err != nil {
    log.Fatal(err)
}

fmt.Println("Inserted a single document: ", insertResult.InsertedID)

如果我們想一次性插入多個文檔,可以傳遞一個切片給 collection.InsertMany 方法:

trainers := []interface{}{misty, brock}

insertManyResult, err := collection.InsertMany(context.TODO(), trainers)
if err != nil {
    log.Fatal(err)
}

fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)

更新文檔

collection.UpdateOne() 方法允許你更新單個文檔。它需要一個 bson.D 類型的參數(shù)來篩選數(shù)據(jù)庫中特定的文檔,然后更新它。

// 篩選 name 字段的值為 Ash 的記錄
filter := bson.D{{"name", "Ash"}}

// 更新 age 字段,值加 1
update := bson.D{
    {"$inc", bson.D{
        {"age", 1}
    }}
}

這幾行代碼會將數(shù)據(jù)庫中名字為 Ash 的文檔的 age 字段的值加 1。

updateResult, err := collection.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)

查詢文檔

如果想要查詢一個文檔,同樣需要提供一個 filter 文檔來篩選,同時需要一個接收結(jié)果的指針。為了查詢單個文檔,可以使用 collection.FindOne() 方法。這個方法會返回一條匹配上的記錄并解析到我們指針指向的地方。你可以使用和上面相同的 filter 來查詢 name 為 Ash 的記錄。

// 創(chuàng)建一個變量用來接收解析后的結(jié)果
var result Trainer

err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)

如果想要查詢多個文檔,可以使用 collection.Find() 方法。這個方法返回一個 Cursor(游標(biāo))。一個 Cursor (游標(biāo))可以讓我們一次獲取到其中一條記錄。一旦一個游標(biāo)遍歷完畢,你應(yīng)該關(guān)閉這個游標(biāo)。

下面的例子中,我們在 Find 的時候同時指定了額外的一些選項,這里我們設(shè)置最多獲取的記錄數(shù)為 2。

// 這個選項會被傳遞給 Find 方法
findOptions := options.Find()
findOptions.SetLimit(2)

// 這是用來保存查詢結(jié)果的數(shù)組
var results []*Trainer

// 傳遞 bson.D{{}} 作為 filter 來匹配 collection 中的所有文檔
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
    log.Fatal(err)
}

// 查詢多個文檔的時候返回一個 cursor
// 迭代這個 cursor 允許我們一次解碼一個文檔
for cur.Next(context.TODO()) {

    // 創(chuàng)建一個用來接收單個文檔的變量
    var elem Trainer
    err := cur.Decode(&elem)
    if err != nil {
        log.Fatal(err)
    }

    results = append(results, &elem)
}

if err := cur.Err(); err != nil {
    log.Fatal(err)
}

// 一旦結(jié)束了獲取數(shù)據(jù)的操作,我們需要關(guān)閉 cursor
cur.Close(context.TODO())

fmt.Println("Found multiple documents (array of pointers): %+v\n", results)

刪除文檔

最后,你可以使用 collection.DeleteOne() 或者 collection.DeleteMany() 來刪除文檔。這里傳遞了 bson.D{ {} } 作為 filter 參數(shù),將會匹配集合中的所有文檔。你也可以使用 collection.Drop 來刪除整個集合。

deleteResult, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)

下一步

MongoDB Go 驅(qū)動的完整文檔可以在 pkg.go.dev 中查看。

總結(jié)

到此這篇關(guān)于Go語言使用MongoDB數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Go使用MongoDB內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Go語言實現(xiàn)選擇排序算法及優(yōu)化

    基于Go語言實現(xiàn)選擇排序算法及優(yōu)化

    選擇排序是一種簡單的比較排序算法.這篇文章將利用Go語言實現(xiàn)冒泡排序算法,文中的示例代碼講解詳細(xì),對學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • Windows下安裝VScode 并使用及中文配置方法

    Windows下安裝VScode 并使用及中文配置方法

    這篇文章主要介紹了Windows下安裝VScode 并使用及中文配置的方法詳解,本文通過圖文并茂的形式給大家介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 如何用go-zero 實現(xiàn)中臺系統(tǒng)

    如何用go-zero 實現(xiàn)中臺系統(tǒng)

    這篇文章主要介紹了如何用go-zero 實現(xiàn)中臺系統(tǒng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • GO語言的控制語句詳解包括GO語言的指針語法

    GO語言的控制語句詳解包括GO語言的指針語法

    這篇文章主要介紹了GO語言的控制語句詳解包括GO語言的指針語法,GO語言switch結(jié)構(gòu),GO語言for的4種結(jié)構(gòu)需要的朋友可以參考下
    2022-12-12
  • golang time包下定時器的實現(xiàn)方法

    golang time包下定時器的實現(xiàn)方法

    定時器的實現(xiàn)大家應(yīng)該都遇到過,最近在學(xué)習(xí)golang,所以下面這篇文章主要給大家介紹了關(guān)于golang time包下定時器的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • 詳解golang?defer?閉包?匿名函數(shù)

    詳解golang?defer?閉包?匿名函數(shù)

    這篇文章主要介紹了golang?defer?閉包?匿名函數(shù)的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go?1.21中引入的新包maps和cmp功能作用詳解

    Go?1.21中引入的新包maps和cmp功能作用詳解

    這篇文章主要為大家介紹了Go?1.21中引入的新包maps和cmp功能作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 詳解Go?依賴管理?go?mod?tidy

    詳解Go?依賴管理?go?mod?tidy

    這篇文章主要為大家介紹了詳解Go?依賴管理?go?mod?tidy,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 基于go實例網(wǎng)絡(luò)存儲協(xié)議詳解

    基于go實例網(wǎng)絡(luò)存儲協(xié)議詳解

    這篇文章主要為大家介紹了基于go實例網(wǎng)絡(luò)存儲協(xié)議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 使用golang進行http,get或postJson請求

    使用golang進行http,get或postJson請求

    這篇文章主要為大家詳細(xì)介紹了如何使用golang進行http,get或postJson請求,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-12-12

最新評論