本篇記錄通過GO語言操作mongodb,實現的流程包括:
- 初始化項目工程
- 容器方式安裝mongo
- 調試運行和編譯運行
go使用mongo的代碼如下,go操作mongo的SDK是mongo-driver,一個第三方模塊。本篇主要就是將其運行起來。
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() {
// 設置客戶端連接配置
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", "小蘭"}}
// 創建一個Student變量用來接收查詢的結果
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)
}
創建GO項目工程
go之前對第三方包的管理不上心,其他語言比如python有pip,nodejs有npm,而go卻沒有一個官方的管理工具。
在go 1.11之前,開發者需要要關注GOPATH環境變量,這對於開發者來說不友好。
經過幾次變更後,go於1.12版本開始正式使用go Module,go終於有了一個官方的處理方式,開發者也可以拋棄GOPATH了。
go的包管理包括:
- 創建一個目錄做工程目錄
- 初始化工程目錄
- 設置包下載代理
- 安裝依賴包
初始化開發工程
➜ 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
初始化成功之後當前目錄下會新建一個go.mod文件,用於記錄安裝的模塊和包
➜ mongo cat go.mod
module mongo
go 1.18
設置包下載代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
安裝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
運行 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 容器並設置庫權限
➜ 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>
調試運行
go run 可以直接下載依賴的模塊,然後運行模塊。
➜ 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}
編譯運行
如果想通過編譯的方法運行程序而不是調試方法,可以通過一下三步:
- go mod tidy 自動更新需要的依賴文件
- go mod download 根據go.mod下載模塊
- go build mongo_dev.go 編譯go
- 執行go程序
➜ 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
執行可執行文件。
➜ 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,並且寫入了三條數據,查詢了一次。
go 模塊管理相關命令
go mod 相關命令
go mod download 下載依賴的module到本地cache(默認爲$GOPATH/pkg/mod目錄)
go mod edit 編輯go.mod文件
go mod graph 打印模塊依賴圖
go mod init 初始化當前文件夾, 創建go.mod文件
go mod tidy 增加缺少的module,刪除無用的module
go mod vendor 將依賴複製到vendor下
go mod verify 校驗依賴
go mod why 解釋爲什麼需要依賴
在go mod模塊管理機制出現之前使用get和install命令管理模塊。
go get
是下載插件 和 go install
下載插件並編譯程序。這些是1.12版本之前的模塊管理方法,已經棄用