脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - 一文带你深入探索Golang操作mongodb的方法

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

2023-02-09 11:53金色旭光 Golang

这篇文章主要为大家详细介绍了Golang操作mongodb的相关知识,包括:初始化项目工程、容器方式安装mongo和调试运行和编译运行,感兴趣的小伙伴可以了解一下

本篇记录通过GO语言操作mongodb,实现的流程包括:

  • 初始化项目工程
  • 容器方式安装mongo
  • 调试运行和编译运行

go使用mongo的代码如下,go操作mongo的SDK是mongo-driver,一个第三方模块。本篇主要就是将其运行起来。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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)
}

1.创建GO项目工程

go之前对第三方包的管理不上心,其他语言比如python有pip,nodejs有npm,而go却没有一个官方的管理工具。

在go 1.11之前,开发者需要要关注GOPATH环境变量,这对于开发者来说不友好。

经过几次变更后,go于1.12版本开始正式使用go Module,go终于有了一个官方的处理方式,开发者也可以抛弃GOPATH了。

go的包管理包括:

  • 创建一个目录做工程目录
  • 初始化工程目录
  • 设置包下载代理
  • 安装依赖包

1.1初始化开发工程

➜  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

1.2安装mongo

下载 mongodb 镜像

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  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
?
1
2
3
4
➜  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 容器

?
1
2
3
4
5
6
7
➜  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 容器并设置库权限

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  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调试运行

go run 可以直接下载依赖的模块,然后运行模块。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  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编译运行

如果想通过编译的方法运行程序而不是调试方法,可以通过一下三步:

  • go mod tidy 自动更新需要的依赖文件
  • go mod download 根据go.mod下载模块
  • go build mongo_dev.go 编译go
  • 执行go程序
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  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 文件中就记载了下载的模块信息,包括路径和版本信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
➜  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
)

下载依赖的模块

?
1
➜  mongo go mod download

模块真正的文件放在gopath路径下的pkg路径下

?
1
2
3
4
5
6
7
8
9
~ 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

编译程序

?
1
2
3
➜  mongo go build mongo_dev.go
➜  mongo ls
go.mod       go.sum       mongo_dev    mongo_dev.go

执行可执行文件。

?
1
2
3
4
5
➜  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,并且写入了三条数据,查询了一次。

2.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版本之前的模块管理方法,已经弃用

到此这篇关于一文带你深入探索Golang操作mongodb的方法的文章就介绍到这了,更多相关Golang操作mongodb内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/goldsunshine/p/17096896.html

延伸 · 阅读

精彩推荐
  • Golanggolang time包下定时器的实现方法

    golang time包下定时器的实现方法

    定时器的实现大家应该都遇到过,最近在学习golang,所以下面这篇文章主要给大家介绍了关于golang time包下定时器的实现方法,文中通过示例代码介绍的非...

    诺唯4752020-05-12
  • Golanggo zero微服务实战系服务拆分

    go zero微服务实战系服务拆分

    这篇文章主要为大家介绍了go zero微服务实战系服务拆分的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    万俊峰Kevin11282022-10-24
  • GolangGo语言的文件操作代码汇总

    Go语言的文件操作代码汇总

    本文给大家汇总介绍了go语言中的文件操作的代码,包括文件的读写,文件的新建打开和删除等,希望对大家学习go语言能够有所帮助 ...

    ck_god2872020-05-20
  • GolangGo语言包和包管理详解

    Go语言包和包管理详解

    这篇文章主要为大家介绍了Go语言包和包管理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    ourlang6662022-09-02
  • Golang使用Go实现TLS服务器和客户端的示例

    使用Go实现TLS服务器和客户端的示例

    本文主要介绍了Go实现TLS服务器和客户端的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    VIL凌霄5162022-01-20
  • Golanggo微服务PolarisMesh源码解析服务端启动流程

    go微服务PolarisMesh源码解析服务端启动流程

    这篇文章主要为大家介绍了go微服务PolarisMesh源码解析服务端启动流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职...

    春少8072023-01-28
  • Golanggolang 字符串拼接性能的对比分析

    golang 字符串拼接性能的对比分析

    这篇文章主要介绍了golang 字符串拼接性能的对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    BigSimle5922021-03-20
  • Golanggolang时间及时间戳的获取转换

    golang时间及时间戳的获取转换

    本文主要介绍了golang时间及时间戳的获取转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    杰哥的技术杂货铺9042022-10-23