最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作指南

 更新時間:2022年09月07日 14:41:15   作者:monzaid  
MongoDB是Nosql中常用的一種數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

安裝配置MongoDB驅(qū)動

安裝驅(qū)動

go get -u github.com/mongodb/mongo-go-driver

初始化模塊

go mod init 模塊名稱

執(zhí)行g(shù)o mod tidy

go mod tidy

導(dǎo)入驅(qū)動

import (
    "context"
    "go.mongodb.org/mongo-driver/bson"    //BOSN解析包
    "go.mongodb.org/mongo-driver/mongo"    //MongoDB的Go驅(qū)動包
    "go.mongodb.org/mongo-driver/mongo/options"
)

獲得數(shù)據(jù)庫連接

初始化連接

package main

import (
    "context"
    "fmt"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

var client *mongo.Client

func initDB() (err error) {
    // 設(shè)置客戶端連接配置
    clientOptions := options.Client().ApplyURI("mongodb://ip:port")
    // 連接到MongoDB
    client, err = mongo.Connect(context.TODO(), clientOptions)
    if err != nil {
        return err
    }
    // 檢查連接
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        return err
    }
    return nil
}

func main() {
    err := initDB() // 調(diào)用輸出化數(shù)據(jù)庫的函數(shù)
    if err != nil {
        fmt.Printf("初始化失??!,err:%v\n", err)
        return
    }else{
    	fmt.Println("Connected to MongoDB!")
    }
}

連接MongoDB的Go驅(qū)動程序中有兩大類型表示BSON數(shù)據(jù):D和Raw。

類型D家族被用來簡潔地構(gòu)建使用本地Go類型的BSON對象。這對于構(gòu)造傳遞給MongoDB的命令特別有用。D家族包括四類:

D:一個BSON文檔。這種類型應(yīng)該在順序重要的情況下使用,比如MongoDB命令。

bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}}

M:一張無序的map。它和D是一樣的,只是它不保持順序。

bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}

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

bson.A{"hello", "world", 3.14159, bson.D{{"abcde", 12345}}}

E:D里面的一個元素。

要使用BSON,需要先導(dǎo)入下面的包:

import "go.mongodb.org/mongo-driver/bson"

Raw類型家族用于驗證字節(jié)切片。你還可以使用Lookup()從原始類型檢索單個元素。如果你不想要將BSON反序列化成另一種類型的開銷,那么這是非常有用的。

數(shù)據(jù)庫操作

添加文檔

添加單個文檔

使用collection.InsertOne()方法插入一條文檔記錄:

func insertOne(s interface{}) (err error) {
    collection := client.Database("datebase").Collection("collection")
    insertResult, err := collection.InsertOne(context.TODO(), s)
    if err != nil {
    	return err
    }
    fmt.Println("Inserted a single document: ", insertResult.InsertedID)
    return nil
}

測試:

s := struct{name string
	age int
}{"tom", 20}
err := insertOne(s)
if err != nil{
	fmt.Printf("添加文檔失??!,err:%v\n", err)
}

添加多個文檔

使用collection.InsertMany()方法插入多條文檔記錄:

func insertMore(s []interface{}) (err error) {
    //students := []interface{}{s2, s3}
    collection := client.Database("datebase").Collection("collection")
    insertManyResult, err := collection.InsertMany(context.TODO(), s)
    if err != nil {
        return err
    }
    fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
    return nil
}

測試:

type Student struct {
    name string
    age int
}
s1 := Student{name: "tom", age: 20}
s2 := Student{name: "kite", age: 21}
s3 := Student{name: "rose", age: 22}
ss := []interface{}{s1, s2, s3}
insertMore(ss)
if err != nil{
	fmt.Printf("添加多個文檔失?。?err:%v\n", err)
}

查找文檔

func find() (err error){
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    collection := client.Database("datebase").Collection("collection")
    cur, err := collection.Find(ctx, bson.D{})
    if err != nil {
        return err
    }
    defer cur.Close(ctx)
    for cur.Next(ctx) {
        var result bson.D
        err := cur.Decode(&result)
        if err != nil {
            return err
        }
        fmt.Printf("result: %v\n", result)
    }
    if err := cur.Err(); err != nil {
        return err
    }
    return nil
}

更新文檔

func update() (err error) {
    ctx := context.TODO()
    defer client.Disconnect(ctx)
    c := client.Database("datebase").Collection("collection")

    update := bson.D{{"$set", bson.D{{"attr1", "value1"}, {"attr2", "value2"}}}}

    ur, err := c.UpdateMany(ctx, bson.D{{"old_attr1", "old_value1"}}, update)
    if err != nil {
        return err
    }
    fmt.Printf("ur.ModifiedCount: %v\n", ur.ModifiedCount)
    return nil
}

刪除文檔

func del() (err error) {
    c := client.Database("datebase").Collection("collection")
    ctx := context.TODO()

    dr, err := c.DeleteMany(ctx, bson.D{{"attr1", "value1"}})

    if err != nil {
        return err
    }
    fmt.Printf("ur.ModifiedCount: %v\n", dr.DeletedCount)
	return nil
}

總結(jié)

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

相關(guān)文章

  • Golang?template?包基本原理分析

    Golang?template?包基本原理分析

    這篇文章主要為大家介紹了Golang?template?包基本原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go語言中嵌入C語言的方法

    Go語言中嵌入C語言的方法

    這篇文章主要介紹了Go語言中嵌入C語言的方法,實例分析了Go語言中cgo工具的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang中json反序列化可能遇到的問題

    golang中json反序列化可能遇到的問題

    這篇文章主要給大家介紹了關(guān)于golang中json反序列化可能遇到的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • golang文件內(nèi)容覆蓋問題的分析及解決

    golang文件內(nèi)容覆蓋問題的分析及解決

    通過golang讀取數(shù)據(jù)庫站點映射配置,生成nginx conf文件,并檢查和重啟nginx服務(wù),已達(dá)到站點自動化部署目的,當(dāng)目標(biāo)文件中內(nèi)容很長,而寫入的內(nèi)容很短時,目標(biāo)文件內(nèi)容無法完全覆蓋,本文給大家介紹了解決方法,需要的朋友可以參考下
    2024-01-01
  • Golang 協(xié)程配合管道的實現(xiàn)示例

    Golang 協(xié)程配合管道的實現(xiàn)示例

    本文主要介紹了Golang協(xié)程配合管道的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 詳解golang RWMutex讀寫互斥鎖源碼分析

    詳解golang RWMutex讀寫互斥鎖源碼分析

    這篇文章主要介紹了詳解golang RWMutex讀寫互斥鎖源碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 淺析Go語言中的棧和先進(jìn)先出原則

    淺析Go語言中的棧和先進(jìn)先出原則

    這篇文章主要來和大家探討一樣如何在Go語言中實現(xiàn)和使用堆棧,以及堆棧如何遵循先進(jìn)先出 (FIFO) 原則,文中的示例代碼簡潔易懂,需要的可以參考一下
    2023-07-07
  • Go中時間與時區(qū)問題的深入講解

    Go中時間與時區(qū)問題的深入講解

    go語言中如果不設(shè)置指定的時區(qū),通過time.Now()獲取到的就是本地時區(qū),下面這篇文章主要給大家介紹了關(guān)于Go中時間與時區(qū)問題的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • 詳解Go中Map類型和Slice類型的傳遞

    詳解Go中Map類型和Slice類型的傳遞

    這篇文章主要為大家詳細(xì)介紹了Go中Map類型和Slice類型的傳遞,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識鞏固

    Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識鞏固

    這篇文章主要為大家介紹了Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識鞏固,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論

永仁县| 金山区| 洛浦县| 礼泉县| 慈溪市| 吉安市| 珠海市| 虹口区| 拜泉县| 依安县| 霍州市| 日土县| 肇州县| 普洱| 绥德县| 乌苏市| 永兴县| 喜德县| 金沙县| 开江县| 南平市| 榆林市| 梁河县| 兴业县| 哈密市| 武乡县| 定陶县| 大田县| 锡林郭勒盟| 原阳县| 三穗县| 文登市| 陕西省| 金湖县| 青川县| 和林格尔县| 太湖县| 奎屯市| 台江县| 博客| 房产|