一文帶你深入探索Golang操作mongodb的方法
本篇記錄通過GO語(yǔ)言操作mongodb,實(shí)現(xiàn)的流程包括:
- 初始化項(xiàng)目工程
- 容器方式安裝mongo
- 調(diào)試運(yùn)行和編譯運(yùn)行
go使用mongo的代碼如下,go操作mongo的SDK是mongo-driver,一個(gè)第三方模塊。本篇主要就是將其運(yùn)行起來。
package main import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/bson" ) type Student struct { Name string Age int } func main() { // 設(shè)置客戶端連接配置 clientOptions := options.Client().ApplyURI("mongodb://admin:123456@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!") collection := client.Database("q1mi").Collection("student") s1 := Student{"小紅", 12} s2 := Student{"小蘭", 10} s3 := Student{"小黃", 11} insertResult, err := collection.InsertOne(context.TODO(), s1) if err != nil { log.Fatal(err) } fmt.Println("Inserted a single document: ", insertResult.InsertedID) students := []interface{}{s2, s3} insertManyResult, err := collection.InsertMany(context.TODO(), students) if err != nil { log.Fatal(err) } fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs) filter := bson.D{{"name", "小蘭"}} // 創(chuàng)建一個(gè)Student變量用來接收查詢的結(jié)果 var result Student err = collection.FindOne(context.TODO(), filter).Decode(&result) if err != nil { log.Fatal(err) } fmt.Printf("Found a single document: %+v\n", result) }
1.創(chuàng)建GO項(xiàng)目工程
go之前對(duì)第三方包的管理不上心,其他語(yǔ)言比如python有pip,nodejs有npm,而go卻沒有一個(gè)官方的管理工具。
在go 1.11之前,開發(fā)者需要要關(guān)注GOPATH環(huán)境變量,這對(duì)于開發(fā)者來說不友好。
經(jīng)過幾次變更后,go于1.12版本開始正式使用go Module,go終于有了一個(gè)官方的處理方式,開發(fā)者也可以拋棄GOPATH了。
go的包管理包括:
- 創(chuàng)建一個(gè)目錄做工程目錄
- 初始化工程目錄
- 設(shè)置包下載代理
- 安裝依賴包
1.1初始化開發(fā)工程
? go mkdir mongo
? go cd mongo
使用mod命令初始化
go mod init 文件名
? go mod init mongo
go: creating new go.mod: module mongo
? ls -al
total 8
drwxr-xr-x 3 ljk staff 96 2 2 22:02 .
drwxr-xr-x 5 ljk staff 160 2 2 22:02 ..
-rw-r--r-- 1 ljk staff 22 2 2 22:02 go.mod
初始化成功之后當(dāng)前目錄下會(huì)新建一個(gè)go.mod文件,用于記錄安裝的模塊和包
? mongo cat go.mod
module mongo
go 1.18
設(shè)置包下載代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
1.2安裝mongo
下載 mongodb 鏡像
? mod docker pull mongo:latest latest: Pulling from library/mongo 70cf24b16239: Pull complete 197e79a59399: Pull complete 1a54d1916136: Pull complete 8547f0e899b2: Pull complete 315a8963db2b: Pull complete 0fce25e2f34f: Pull complete 1ce995f0f803: Pull complete e3bfd9b7202d: Pull complete 07bd59396de7: Pull complete Digest: sha256:3fe527dcddf277d4d5b278f5f03ddea5173cee84c792d12c5ac90c36ba40ba7a Status: Downloaded newer image for mongo:latest docker.io/library/mongo:latest
? mod docker images REPOSITORY TAG IMAGE ID CREATED SIZE mongo latest b2fa76e584f6 20 hours ago 618MB redis 5.0.4 b61ab367aee1 3 years ago 90MB
運(yùn)行 mongodb 容器
? mod docker run -itd --name mongo -p 27017:27017 mongo --auth f3116f4e2ed1d81e7707ee42b67c01fdcd648461e1e7cd35ad0815dae2c1af5f ? mod ? mod ? mod docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f3116f4e2ed1 mongo "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:27017->27017/tcp mongo
登錄 mongodb 容器并設(shè)置庫(kù)權(quán)限
? mod docker exec -it mongo mongosh admin Current Mongosh Log ID: 63dbcaa4fb21cc3d13dcfde2 Connecting to: mongodb://127.0.0.1:27017/admin?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2 Using MongoDB: 6.0.4 Using Mongosh: 1.6.2 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy). You can opt-out by running the disableTelemetry() command. admin> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); { ok: 1 } admin> db.auth('admin', '123456') { ok: 1 } admin>
1.3調(diào)試運(yùn)行
go run 可以直接下載依賴的模塊,然后運(yùn)行模塊。
? mongo go run mongo_dev.go go: downloading go.mongodb.org/mongo-driver v1.11.1 go: downloading github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d go: downloading github.com/pkg/errors v0.9.1 go: downloading github.com/golang/snappy v0.0.1 go: downloading github.com/klauspost/compress v1.13.6 go: downloading github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe go: downloading github.com/xdg-go/scram v1.1.1 go: downloading github.com/xdg-go/stringprep v1.0.3 go: downloading golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d go: downloading golang.org/x/sync v0.0.0-20210220032951-036812b2e83c go: downloading golang.org/x/text v0.3.7 go: downloading github.com/xdg-go/pbkdf2 v1.0.0 Connected to MongoDB! Inserted a single document: ObjectID("63dbcaf83e1180444cc7dca1") Inserted multiple documents: [ObjectID("63dbcaf83e1180444cc7dca2") ObjectID("63dbcaf83e1180444cc7dca3")] Found a single document: {Name:小蘭 Age:10}
1.4編譯運(yùn)行
如果想通過編譯的方法運(yùn)行程序而不是調(diào)試方法,可以通過一下三步:
- go mod tidy 自動(dòng)更新需要的依賴文件
- go mod download 根據(jù)go.mod下載模塊
- go build mongo_dev.go 編譯go
- 執(zhí)行g(shù)o程序
? mongo_three go mod tidy go: finding module for package go.mongodb.org/mongo-driver/mongo/options go: finding module for package go.mongodb.org/mongo-driver/bson go: finding module for package go.mongodb.org/mongo-driver/mongo go: found go.mongodb.org/mongo-driver/bson in go.mongodb.org/mongo-driver v1.11.1 go: found go.mongodb.org/mongo-driver/mongo in go.mongodb.org/mongo-driver v1.11.1 go: found go.mongodb.org/mongo-driver/mongo/options in go.mongodb.org/mongo-driver v1.11.1 go: downloading github.com/google/go-cmp v0.5.2 go: downloading github.com/stretchr/testify v1.6.1 go: downloading github.com/tidwall/pretty v1.0.0 go: downloading github.com/kr/pretty v0.1.0 go: downloading github.com/kr/text v0.1.0 go: downloading github.com/davecgh/go-spew v1.1.1 go: downloading github.com/pmezard/go-difflib v1.0.0 go: downloading gopkg.in/yaml.v3 v3.0.1 go: downloading golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
更新依賴文件之后,go.mod 文件中就記載了下載的模塊信息,包括路徑和版本信息
? mongo cat go.mod module mongo go 1.18 require ( github.com/golang/snappy v0.0.1 // indirect github.com/klauspost/compress v1.13.6 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/pkg/errors v0.9.1 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.1 // indirect github.com/xdg-go/stringprep v1.0.3 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect go.mongodb.org/mongo-driver v1.11.1 // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/text v0.3.7 // indirect )
下載依賴的模塊
? mongo go mod download
模塊真正的文件放在gopath路徑下的pkg路徑下
~ go env . . GOPATH="/Users/ljk/Documents/go" ? mod pwd /Users/ljk/Documents/go/pkg/mod ? mod ls cache github.com go.mongodb.org golang.org
編譯程序
? mongo go build mongo_dev.go ? mongo ls go.mod go.sum mongo_dev mongo_dev.go
執(zhí)行可執(zhí)行文件。
? mongo ./mongo_dev Connected to MongoDB! Inserted a single document: ObjectID("63e1096ce7684b84e5b3229a") Inserted multiple documents: [ObjectID("63e1096ce7684b84e5b3229b") ObjectID("63e1096ce7684b84e5b3229c")] Found a single document: {Name:小蘭 Age:10}
可以看到程序連接到mongodb,并且寫入了三條數(shù)據(jù),查詢了一次。
2.go 模塊管理相關(guān)命令
go mod 相關(guān)命令
- go mod download 下載依賴的module到本地cache(默認(rèn)為$GOPATH/pkg/mod目錄)
- go mod edit 編輯go.mod文件
- go mod graph 打印模塊依賴圖
- go mod init 初始化當(dāng)前文件夾, 創(chuàng)建go.mod文件
- go mod tidy 增加缺少的module,刪除無用的module
- go mod vendor 將依賴復(fù)制到vendor下
- go mod verify 校驗(yàn)依賴
- go mod why 解釋為什么需要依賴
在go mod模塊管理機(jī)制出現(xiàn)之前使用get和install命令管理模塊。
go get
是下載插件 和 go install
下載插件并編譯程序。這些是1.12版本之前的模塊管理方法,已經(jīng)棄用
到此這篇關(guān)于一文帶你深入探索Golang操作mongodb的方法的文章就介紹到這了,更多相關(guān)Golang操作mongodb內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解如何使用Golang操作MongoDB數(shù)據(jù)庫(kù)
- Go語(yǔ)言學(xué)習(xí)筆記之golang操作MongoDB數(shù)據(jù)庫(kù)
- golang連接MongoDB數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)操作指南
- 詳解Golang使用MongoDB通用操作
- 利用golang驅(qū)動(dòng)操作MongoDB數(shù)據(jù)庫(kù)的步驟
- Golang對(duì)MongoDB數(shù)據(jù)庫(kù)的操作簡(jiǎn)單封裝教程
- golang操作mongodb的方法
- Golang操作mongodb的實(shí)現(xiàn)示例
相關(guān)文章
Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例
責(zé)任鏈?zhǔn)且环N行為設(shè)計(jì)模式, 允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送, 直至其中一個(gè)處理者對(duì)其進(jìn)行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析
這篇文章主要介紹了Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下2017-02-02Golang中String,rune和byte的相互轉(zhuǎn)換
Go語(yǔ)言中,string就是只讀的采用utf8編碼的字節(jié)切片,rune是int32的別名,代表字符的Unicode編碼,這篇文章主要介紹了Golang中String,rune和byte的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下2023-10-10