通过mongo-driver使用说明 GO 包管理机制

本篇记录通过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版本之前的模块管理方法,已经弃用
通过mongo-driver使用说明 GO 包管理机制的更多相关文章
- Android包管理机制(二)PackageInstaller安装APK
前言 在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInsta ...
- Android包管理机制(一) PackageInstaller的初始化
前言 包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一. 包指的是Apk.jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一 ...
- ubuntu包管理机制
1 ubuntu包管理机制 跟大家分享一下ubuntu的软件管理机制.如果你们有过: apt-get install 或者 apt-get update 失败的经历. 在众多的apt命令中迷失. 疑惑 ...
- 前端工程化 - 剖析npm的包管理机制
转自https://juejin.im/post/5df789066fb9a0161f30580c 现如今,前端开发的同学已经离不开 npm 这个包管理工具,其优秀的包版本管理机制承载了整个繁荣发展的 ...
- Node: 包管理机制
Node.js 的模块机制可以很好地解决业务代码混乱的难题,但对于第三方模块包,就有些力不从心了,因为第三方模块包分散存放在各地,无法集中式管理.这就需要一个包管理机制,在 Node.js 中,Isa ...
- Golang 包管理机制
Golang 包管理机制 1. 历史 在go1.11之前, 并没有官方的包管理机制(Godep算个半官方), 主流的包管理机制有: GoVendor Glide Godep 在go1.11之后, 官方 ...
- 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...
- Android的包管理机制浅析(二)
上篇刚好说到获取到了签名信息,以下进入安装过程,直接上源代码: private void installNewPackageLI(PackageParser.Package pkg, int pars ...
- 前端Leader你应该知道的NPM包管理机制
npm install 命令 首先总结下npm 安装一个模块包的常用命令. /* 模块依赖会写入 dependencies 节点 */ npm install moduleName npm insta ...
- Linux对包管理阐述
Centos/Redhat/Fedora的软件包,都是rpm后缀的文件.包管理器rpm(Redhat packages manager) linux的哲学思想是简单命令解决复杂任务,因此每个软件的功 ...
随机推荐
- Aspire 框架预览版发布,使云原生开发和运维更加简单
随着 .NET 8 的发布,.NET Aspire 也随之发布,这是一个全家桶框架旨在加快基于云的应用程序的构建..NET Aspire 从一开始就集成了关键组件,例如遥测和运行状况检查.它还承诺提供 ...
- .NET8.0 AOT 经验分享 - 专项测试各大 ORM 是否支持
AOT 特点 发布和部署本机 AOT 应用具有以下优势: 最大程度减少磁盘占用空间:使用本机 AOT 发布时,将生成一个可执行文件,其中仅包含支持程序所需的外部依赖项的代码.减小的可执行文件大小可能会 ...
- 生产实践:Redis与Mysql的数据强一致性方案
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 数据库和Redis如何保持强一致性,这篇文章告诉你 目的 Redis和Msql来保持数据同步,并且强一致,以此来提高对应接 ...
- Android学习day03【跑马灯】
这个学习内容很简单,说一下自己笨蛋的点吧 要实现这种情况,我始终没有办法实现(也就是跑马灯,图片没办法显示) 后来发现 android:layout_width="wrap_content& ...
- Markdown 跳转到本文章标题
一.只可以在Markdown文件中跳转 1.因为 Markdown 文件标题就是 Markdown 一种锚点 任何级别的标题可以直接作为锚点目标.如果标题比较固定(不是经常改来改去),可以直接使用标题 ...
- Navicat远程连接Centos8.4服务器MySQL8.0数据库
一.首先登陆服务器后台管理,使服务器开放3306策略 二.开启远程连接 1.登陆服务器的MySQL数据库 mysql -uroot -p 2.登录成功后,切换数据库 use mysql; 3.查看当前 ...
- DevOps|研发提效-敏捷开发之每日站立会
对于研发效能团队建设和组织,本文不再赘述,可以参考之前的文章,已经讲得很透彻了.本文重点讲我们日常是怎么开站立会,怎么让团队跑起来,高效能产出的.每日站立会,15分钟到30分钟,看似非常短的一个会,但 ...
- vertx的学习总结2
一.什么是verticle verticle是vertx的基本单元,其作用就是封装用于处理事件的技术功能单元 (如果不能理解,到后面的实战就可以理解了) 二.写一个verticle 1. 引入依赖( ...
- [CF1601C] Optimal Insertion
Optimal Insertion 题面翻译 题目大意 给定两个序列 \(a,b\),长度分别为 \(n,m(1\leq n,m\leq 10^6)\).接下来将 \(b\) 中的所有元素以任意方式插 ...
- 16、strconv
1.strconv是什么? strconv是用来处理字符串和基本类型之间的转换的 2.strconv的使用 /** * @author ly (个人博客:https://www.cnblogs.com ...