golang連接MongoDB數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)操作指南
安裝配置MongoDB驅(qū)動(dòng)
安裝驅(qū)動(dòng)
go get -u github.com/mongodb/mongo-go-driver
初始化模塊
go mod init 模塊名稱
執(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)程序中有兩大類型表示BSON數(shù)據(jù):D和Raw。
類型D家族被用來(lái)簡(jiǎn)潔地構(gòu)建使用本地Go類型的BSON對(duì)象。這對(duì)于構(gòu)造傳遞給MongoDB的命令特別有用。D家族包括四類:
D:一個(gè)BSON文檔。這種類型應(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類型家族用于驗(yàn)證字節(jié)切片。你還可以使用Lookup()從原始類型檢索單個(gè)元素。如果你不想要將BSON反序列化成另一種類型的開(kāi)銷,那么這是非常有用的。
數(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文件內(nèi)容覆蓋問(wèn)題的分析及解決
通過(guò)golang讀取數(shù)據(jù)庫(kù)站點(diǎn)映射配置,生成nginx conf文件,并檢查和重啟nginx服務(wù),已達(dá)到站點(diǎn)自動(dòng)化部署目的,當(dāng)目標(biāo)文件中內(nèi)容很長(zhǎng),而寫(xiě)入的內(nèi)容很短時(shí),目標(biāo)文件內(nèi)容無(wú)法完全覆蓋,本文給大家介紹了解決方法,需要的朋友可以參考下2024-01-01
Golang 協(xié)程配合管道的實(shí)現(xiàn)示例
本文主要介紹了Golang協(xié)程配合管道的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
詳解golang RWMutex讀寫(xiě)互斥鎖源碼分析
這篇文章主要介紹了詳解golang RWMutex讀寫(xiě)互斥鎖源碼分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Go中時(shí)間與時(shí)區(qū)問(wèn)題的深入講解
go語(yǔ)言中如果不設(shè)置指定的時(shí)區(qū),通過(guò)time.Now()獲取到的就是本地時(shí)區(qū),下面這篇文章主要給大家介紹了關(guān)于Go中時(shí)間與時(shí)區(qū)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2021-12-12
Go語(yǔ)言基礎(chǔ)語(yǔ)法和基本數(shù)據(jù)類型知識(shí)鞏固
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)語(yǔ)法和基本數(shù)據(jù)類型知識(shí)鞏固,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

