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

一文帶你深入探索Golang操作mongodb的方法

 更新時(shí)間:2023年02月07日 14:46:33   作者:金色旭光  
這篇文章主要為大家詳細(xì)介紹了Golang操作mongodb的相關(guān)知識(shí),包括:初始化項(xiàng)目工程、容器方式安裝mongo和調(diào)試運(yùn)行和編譯運(yùn)行,感興趣的小伙伴可以了解一下

本篇記錄通過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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例

    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-06
  • golang 如何獲取文件夾下面的文件列表

    golang 如何獲取文件夾下面的文件列表

    這篇文章主要介紹了golang 獲取文件夾下面的文件列表方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析

    Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析

    這篇文章主要介紹了Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下
    2017-02-02
  • Golang中常見加密算法的總結(jié)

    Golang中常見加密算法的總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Golang中常見的一些加密算法的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • golang使用DockerFile正確用法指南

    golang使用DockerFile正確用法指南

    docker在開發(fā)和運(yùn)維中使用的場(chǎng)景越來越多,作為開發(fā)人員非常有必要了解一些docker的基本知識(shí),而離我們工作中最近的也就是對(duì)應(yīng)用的docker部署編排了,這篇文章主要給大家介紹了關(guān)于golang使用DockerFile的正確用法指南,需要的朋友可以參考下
    2024-03-03
  • Go方法接收者值接收者與指針接收者詳解

    Go方法接收者值接收者與指針接收者詳解

    這篇文章主要為大家介紹了Go方法接收者值接收者與指針接收者詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Golang內(nèi)存模型教科書級(jí)講解

    Golang內(nèi)存模型教科書級(jí)講解

    go官方介紹go內(nèi)存模型的時(shí)候說:探究在什么條件下,goroutine?在讀取一個(gè)變量的值的時(shí),能夠看到其它?goroutine?對(duì)這個(gè)變量進(jìn)行的寫的結(jié)果,Go內(nèi)存模型規(guī)定了一些條件,在這些條件下,在一個(gè)goroutine中讀取變量返回的值能夠確保是另一個(gè)goroutine中對(duì)該變量寫入的值
    2023-03-03
  • Golang中String,rune和byte的相互轉(zhuǎn)換

    Golang中String,rune和byte的相互轉(zhuǎn)換

    Go語(yǔ)言中,string就是只讀的采用utf8編碼的字節(jié)切片,rune是int32的別名,代表字符的Unicode編碼,這篇文章主要介紹了Golang中String,rune和byte的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下
    2023-10-10
  • Golang httptest包測(cè)試使用教程

    Golang httptest包測(cè)試使用教程

    這篇文章主要介紹了Golang httptest包測(cè)試使用,httptest包的理念是,非常容易模擬http服務(wù),也就是說模擬響應(yīng)寫(response writer),提供給http處理器(handle),讓我們測(cè)試http服務(wù)端和客戶端很容易
    2023-03-03
  • Golang中錯(cuò)誤處理機(jī)制詳解

    Golang中錯(cuò)誤處理機(jī)制詳解

    平時(shí)在項(xiàng)目開發(fā)過程中少不了對(duì)錯(cuò)誤的處理,一個(gè)好用的系統(tǒng)首先要確保其健壯性,不能經(jīng)常發(fā)生錯(cuò)誤就卡死之類的情況,為了讓我們的程序更加健壯,我們就需要知道golang里的錯(cuò)誤處理機(jī)制是怎么樣的,這篇文章帶大家一起學(xué)習(xí),需要的朋友跟著小編一起來看看吧
    2024-05-05

最新評(píng)論