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

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

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

安裝配置MongoDB驅(qū)動(dòng)

安裝驅(qū)動(dòng)

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

初始化模塊

go mod init 模塊名稱(chēng)

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

go mod tidy

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

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

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

初始化連接

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ù)庫(kù)的函數(shù)
    if err != nil {
        fmt.Printf("初始化失敗!,err:%v\n", err)
        return
    }else{
    	fmt.Println("Connected to MongoDB!")
    }
}

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

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

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

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

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

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

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

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

E:D里面的一個(gè)元素。

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

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

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

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

添加文檔

添加單個(gè)文檔

使用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
}

測(cè)試:

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

添加多個(gè)文檔

使用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
}

測(cè)試:

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("添加多個(gè)文檔失??!,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ù)庫(kù)及數(shù)據(jù)庫(kù)操作指南的文章就介紹到這了,更多相關(guān)golang連接MongoDB數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解

    Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解

    在計(jì)算機(jī)科學(xué)中,stack(棧)是一種基本的數(shù)據(jù)結(jié)構(gòu),它是一種線性結(jié)構(gòu),具有后進(jìn)先出(Last In First Out)的特點(diǎn)。本文將通過(guò)Golang實(shí)現(xiàn)堆棧,需要的可以參考一下
    2023-04-04
  • Go語(yǔ)言之init函數(shù)

    Go語(yǔ)言之init函數(shù)

    Go語(yǔ)言有一個(gè)特殊的函數(shù)init,先于main函數(shù)執(zhí)行,實(shí)現(xiàn)包級(jí)別的一些初始化操作。這篇文章介紹了Go中的Init函數(shù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 分布式架構(gòu)在Go語(yǔ)言網(wǎng)站的應(yīng)用

    分布式架構(gòu)在Go語(yǔ)言網(wǎng)站的應(yīng)用

    分布式架構(gòu)是目前應(yīng)對(duì)高流量、高并發(fā)的重要解決方案,分布式架構(gòu)的核心思想是分而治之,將單臺(tái)服務(wù)器的資源劃分為多臺(tái)服務(wù)器進(jìn)行協(xié)同完成,分布式架構(gòu)應(yīng)用于Go語(yǔ)言網(wǎng)站中既能提升服務(wù)速度,又能降低了服務(wù)器宕機(jī)的風(fēng)險(xiǎn)
    2024-01-01
  • 分享6個(gè)Go處理字符串的技巧小結(jié)

    分享6個(gè)Go處理字符串的技巧小結(jié)

    這篇文章主要介紹了分享6個(gè)Go處理字符串的技巧小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫(xiě)或者小寫(xiě)的方法

    Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫(xiě)或者小寫(xiě)的方法

    這篇文章主要介紹了Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫(xiě)或者小寫(xiě)的方法,實(shí)例分析了ToLower和ToUpper函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例

    golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例

    這篇文章主要介紹了golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • go語(yǔ)言中讀取配置文件的方法總結(jié)

    go語(yǔ)言中讀取配置文件的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了go語(yǔ)言中讀取配置文件的幾個(gè)常見(jiàn)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考下
    2023-08-08
  • goalng?結(jié)構(gòu)體?方法集?接口實(shí)例詳解

    goalng?結(jié)構(gòu)體?方法集?接口實(shí)例詳解

    這篇文章主要為大家介紹了goalng?結(jié)構(gòu)體?方法集?接口實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn)

    Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn)

    本文主要介紹了Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • go語(yǔ)言算法題解二叉樹(shù)的拷貝、鏡像和對(duì)稱(chēng)

    go語(yǔ)言算法題解二叉樹(shù)的拷貝、鏡像和對(duì)稱(chēng)

    這篇文章主要為大家詳細(xì)介紹了go語(yǔ)言算法題解二叉樹(shù)的拷貝、鏡像和對(duì)稱(chēng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01

最新評(píng)論