Go 使用 MongoDB
- MongoDB 安装(Docker)
- 安装 MongoDB Go 驱动
- 使用 Go Driver 连接到 MongoDB
- 在 Go 里面使用 BSON 对象
- CRUD 操作
- 插入文档
- 更新文档
- 查询文档
- 删除文档
- 下一步
MongoDB 安装(Docker)
先装个 mongo,为了省事就用 docker 了。
docker 的 daemon.json 加一个国内的源地址:
"registry-mirrors": ["http://hub-mirror.c.163.com"
]
然后拉取 mongo 镜像:
docker pull mongodb
启动 mongo:
docker run -p 27017:27017 mongo
安装 MongoDB Go 驱动
go get go.mongodb.org/mongo-driver
基础代码
创建 main.go 文件,并且导入 bson,mongo 和 mongo/options 包。
package mainimport("context""fmt""log""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)// 在后面的代码中将会使用这个 Trainer 结构体
type Trainer struct {Name stringAge intCity string
}func main() {//
}
使用 Go Driver 连接到 MongoDB
一旦 MongoDB 的 Go 驱动被导入之后,我们就可以使用 mongo.Connect 函数来连接到 MongoDB。你必须传递一个 context 和 options.ClientOptions 对象给 mongo.Connect 函数。options.ClientOptions 被用来设置连接配置。
// 设置连接参数
clientOptions := options.Client().ApplyURI("mongodb://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!")
一旦你连接上了 MongoDB,你现在可以获取 test 数据库的 trainers 集合。
collection := client.Dataabse("test").Collection("trainers")
下面的代码将会使用 collection 来查询 trainers 集合。
如果你不在需要查询 MongoDB,就可以使用 client.Disconnect() 来关闭 MongoDB 连接。
err = client.Disconnect(context.TODO())if err != nil {log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")
在 Go 里面使用 BSON 对象
在发送查询请求到 MongoDB 之前,了解如何使用 BSON 对象是非常有必要的。在 MongoDB 中存储的 JSON 文档叫 BSON,是以二进制形式存储的。不像其他数据库以字符串形式存储 JSOn 数据,BSON 还包含了字段类型,这使得应用程序更容易可靠地处理、排序和比较。Go 的 MongoDB 驱动有两个表示 BSON 数据的类型:D 类型和 Raw 类型。
D 类型用于使用 Go 中的原始类型来构建 BSON 对象。这对于传递给 MongoDB 的命令特别有用。D 类型包括四种类型:
-
D:一个 BSON 文档。
-
M:无序的 map。
-
A:一个 BSON 数组。
-
E:D 里面的单个元素。
这里是一个使用 D 类型筛选文档的例子,这里会筛选出名字为 Alice 或者 Bob 的数据:
bson.D({"name",bson.D{{"$in": bson.A{"Alice", "Bob"}}}
})
CRUD 操作
一旦你连接到了数据库,我们就可以开始添加或者操作数据库中的数据了。Collection 类型有一些方法允许你发送查询到数据库中。
插入文档
首先,创建一些新的 Trainer 结构体来插入到数据库中:
ash := Trainer{"Ash", 10, "Pallet Town"}
misty := Trainer{"Misty", 10, "Cerulean City"}
brock := Trainer{"Brock", 15, "Pewter" City}
可以使用 collection.InsertOne() 方法来插入单个文档:
insertResult, err := collection.InsertOne(context.TODO(), ash)
if err != nil {log.Fatal(err)
}fmt.Println("Inserted a single document: ", insertResult.InsertedID)
如果我们想一次性插入多个文档,可以传递一个切片给 collection.InsertMany 方法:
trainers := []interface{}{misty, brock}insertManyResult, err := collection.InsertMany(context.TODO(), trainers)
if err != nil {log.Fatal(err)
}fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
更新文档
collection.UpdateOne() 方法允许你更新单个文档。它需要一个 bson.D 类型的参数来筛选数据库中特定的文档,然后更新它。
// 筛选 name 字段的值为 Ash 的记录
filter := bson.D{{"name", "Ash"}}// 更新 age 字段,值加 1
update := bson.D{{"$inc", bson.D{{"age", 1}}}
}
这几行代码会将数据库中名字为 Ash 的文档的 age 字段的值加 1。
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {log.Fatal(err)
}
fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
查询文档
如果想要查询一个文档,同样需要提供一个 filter 文档来筛选,同时需要一个接收结果的指针。为了查询单个文档,可以使用 collection.FindOne() 方法。这个方法会返回一条匹配上的记录并解析到我们指针指向的地方。你可以使用和上面相同的 filter 来查询 name 为 Ash 的记录。
// 创建一个变量用来接收解析后的结果
var result Trainererr = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)
如果想要查询多个文档,可以使用 collection.Find() 方法。这个方法返回一个 Cursor(游标)。一个 Cursor (游标)可以让我们一次获取到其中一条记录。一旦一个游标遍历完毕,你应该关闭这个游标。
下面的例子中,我们在 Find 的时候同时指定了额外的一些选项,这里我们设置最多获取的记录数为 2。
// 这个选项会被传递给 Find 方法
findOptions := options.Find()
findOptions.SetLimit(2)// 这是用来保存查询结果的数组
var results []*Trainer// 传递 bson.D{{}} 作为 filter 来匹配 collection 中的所有文档
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {log.Fatal(err)
}// 查询多个文档的时候返回一个 cursor
// 迭代这个 cursor 允许我们一次解码一个文档
for cur.Next(context.TODO()) {// 创建一个用来接收单个文档的变量var elem Trainererr := cur.Decode(&elem)if err != nil {log.Fatal(err)}results = append(results, &elem)
}if err := cur.Err(); err != nil {log.Fatal(err)
}// 一旦结束了获取数据的操作,我们需要关闭 cursor
cur.Close(context.TODO())fmt.Println("Found multiple documents (array of pointers): %+v\n", results)
删除文档
最后,你可以使用 collection.DeleteOne() 或者 collection.DeleteMany() 来删除文档。这里传递了 bson.D{ {} } 作为 filter 参数,将会匹配集合中的所有文档。你也可以使用 collection.Drop 来删除整个集合。
deleteResult, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)
下一步
MongoDB Go 驱动的完整文档可以在 pkg.go.dev 中查看。
相关文章:
Go 使用 MongoDB
MongoDB 安装(Docker)安装 MongoDB Go 驱动使用 Go Driver 连接到 MongoDB在 Go 里面使用 BSON 对象CRUD 操作 插入文档更新文档查询文档删除文档 下一步 MongoDB 安装(Docker) 先装个 mongo,为了省事就用 docker 了。 docker 的 daemon.json 加一个国内的源地址…...
什么是g++-arm-linux-gnueabihf
2024年5月3日,周五晚上 g-arm-linux-gnueabihf 是针对 ARM 架构(ARMv7 和 ARMv8)的 Linux 系统开发的 GNU C 编译器套件,可以在 x86 或 x86_64 架构的主机上使用,用于交叉编译 ARM Linux 应用程序和库。 与 gcc-arm-l…...
Unity延时触发的几种常规方法
目录 1、使用协程Coroutine2、使用Invoke、InvokeRepeating函数3、使用Time.time4、使用Time.deltaTime5、使用DOTween。6、使用Vision Timer。 1、使用协程Coroutine public class Test : MonoBehaviour {// Start is called before the first frame updatevoid Start(){ …...
CSS文字描边,文字间隔,div自定义形状切割
clip-path: polygon( 0 0, 68% 0, 100% 32%, 100% 100%, 0 100% );//这里切割出来是少一角的正方形 letter-spacing: 1vw; //文字间隔 -webkit-text-stroke: 1px #fff; //文字描边1px uniapp微信小程序顶部导航栏设置透明,下拉改变透明度 onP…...
XWiki 服务没有正确部署在tomcat中,如何尝试手动重新部署?
1. 停止 Tomcat 服务 首先,您需要停止正在运行的 Tomcat 服务器,以确保在操作文件时不会发生冲突或数据损坏: sudo systemctl stop tomcat2. 清空 webapps 下的 xwiki 目录和 work 目录中相关的缓存 删除 webapps 下的 xwiki 目录和 work …...
【退役之重学Java】关于 Redis
一、Redis 都有哪些数据类型 String 最基本的类型,普通的set和get,做简单的kv缓存hash 这是一个类似map 的一种结构,这个一般可以将结构化的数据,比如一个对象(前提是这个对象没有嵌套其他的对象)给缓存在…...
DateKit
目录 1、 DateKit 1.1、 DaysBetween 1.2、 compareDate 1.3、 dateFormat 1.4、 birthdayFormat 1.5、 getYesterday...
百度智能云数据仓库 Palo 实战课程
通过本课程,您将学习如何使用 Palo 构建高性能、低延迟的分布式数仓服务,掌握数据建模、数据导入、查询优化和系统调优等技能,掌握如何管理和运维 Palo 集群,提高数据处理和分析的效率。同时,我们将进一步向您介绍 Pal…...
服务端JavaScript(Node.js)与去IO编程:Node.js的事件驱动和非阻塞IO模型,它是如何使JavaScript走向后端的
在Node.js中,JavaScript代码运行在V8引擎上。由于JavaScript是单线程语言,一次只能处理一个事件。为了解决这个问题,Node.js引入了事件驱动模型。每个进行IO操作的函数都是异步的,当这个函数被调用的时候,它不会立即执…...
一键局域网共享工具
一键局域网共享工具:实现文件快速共享的新选择 在数字化时代,文件共享已成为我们日常工作和生活中的重要需求。无论是在家庭还是在办公环境中,我们经常需要在不同的设备之间传输文件。为了满足这一需求,一键局域网共享工具应运而…...
python实现把doc文件批量转化为docx
python实现把doc文件批量转化为docx import os from win32com import client as wcdef doSaveAas(doc_path,docx_path):#该函数参考https://blog.csdn.net/m0_38074612/article/details/128985384word wc.Dispatch(Word.Application)doc word.Documents.Open(doc_path) # 目…...
WEB基础---反射
什么是反射 相对官方解释 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力; 在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 在运行的时候获取到的类信息 封装一个字节码对象…...
impdp恢复表后发现比原表多了100多行
因客户删除数据,恢复表时发现恢复表后发现比原表多了100多行,啥原因暂不清楚,继续学习 [oraclehydb ~]$ more expdp_orcl_20240406_2100.log |grep "USR_HY"."T_COPIES". . exported "USR_HY"."T_COPIES…...
Jupyter配置远程访问的密码
安装 下载Anaconda的.sh文件后,上传到服务器,然后进行安装: chmod x anaconda.sh ./anaconda.sh创建虚拟环境 可以指定Python版本创建虚拟环境: conda create --name langchain python3.11.7 conda activate langchain conda …...
Windows下通过MySQL Installer安装MySQL服务
在Windows下,使用MySQL Installer来安装MySQL服务是一个相对简单的过程。以下是一步一步的详细指南: 下载MySQL Installer: 访问MySQL官方网站(https://www.mysql.com/downloads/),在下载页面选择合适的MyS…...
C语言 [力扣]详解环形链表和环形链表II
各位友友们,好久不见呀!又到了我们相遇的时候,每次相遇都是一种缘分。但我更加希望我的文章可以帮助到大家。下面就来具体看看今天所要讲的题目。 文章目录 1.环形链表2.环形链表II 1.环形链表 题目描述:https://leetcode.cn/problems/link…...
Threejs 学习笔记 | 灯光与阴影
文章目录 Threejs 学习笔记 | 灯光与阴影如何让灯光照射在物体上有阴影LightShadow - 阴影类的基类平行光的shadow计算投影属性 - DirectionalLightShadow类平行光的投射相机 聚光灯的shadow计算投影属性- SpotLightShadow类聚光灯的投射相机 平行光 DirectionalLight聚光灯 Sp…...
SSH:安全远程访问的基石
SSH:安全远程访问的基石 一、引言 在当今这个数字化、网络化的时代,远程访问和管理计算机资源已成为日常工作的重要组成部分。然而,如何在不安全的网络环境中确保数据传输的机密性、完整性和可靠性,成为了一个亟待解决的问题。S…...
杰发科技AC7801——ADC之Bandgap和内部温度计算
0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解(内部带隙电压基准) 虽然看不懂这些公式,但是比较重要的一句应该是这个:因为传统带隙基准的输出值为1.2V 1. 使用 参考示例代码。 40002000是falsh控制器寄…...
了解 macOS 中的系统完整性保护 (SIP):开启与关闭
在 macOS 系统中,有一个名为系统完整性保护 (System Integrity Protection,SIP) 的重要功能。SIP 旨在保护系统文件和进程免受未经授权的访问和修改,从而提高系统的安全性和稳定性。然而,在某些情况下,用户可能需要临时…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
