goframe开发一个企业网站 MongoDB 完整工具包18
1. MongoDB 工具包完整实现 (mongodb.go)
package mongodbimport ("context""fmt""time""github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)var (Client *mongo.ClientDatabase string
)// Init MongoDB初始化连接
func Init() error {ctx := context.Background()cfg := g.Cfg()// 获取配置参数uri := cfg.MustGet(ctx, "mongodb.uri").String()Database = cfg.MustGet(ctx, "mongodb.database").String()username := cfg.MustGet(ctx, "mongodb.username").String()password := cfg.MustGet(ctx, "mongodb.password").String()maxPoolSize := cfg.MustGet(ctx, "mongodb.maxPoolSize").Uint64()minPoolSize := cfg.MustGet(ctx, "mongodb.minPoolSize").Uint64()maxConnIdleTime := cfg.MustGet(ctx, "mongodb.maxConnIdleTime").Int64()// 创建连接选项clientOptions := options.Client().ApplyURI(uri).SetAuth(options.Credential{Username: username,Password: password,}).SetMaxPoolSize(maxPoolSize).SetMinPoolSize(minPoolSize).SetMaxConnIdleTime(time.Duration(maxConnIdleTime) * time.Second)// 建立连接Client, err = mongo.Connect(ctx, clientOptions)if err != nil {return err}// 测试连接if err := Client.Ping(ctx, nil); err != nil {return err}return nil
}// IsInitialized 检查是否已初始化
func IsInitialized() bool {return Client != nil
}// GetCollection 获取集合
func GetCollection(collection string) (*mongo.Collection, error) {if !IsInitialized() {return nil, fmt.Errorf("MongoDB client is not initialized")}return Client.Database(Database).Collection(collection), nil
}// Create 创建文档
func Create(collection string, document interface{}) (*mongo.InsertOneResult, error) {coll, err := GetCollection(collection)if err != nil {return nil, err}return coll.InsertOne(context.Background(), document)
}// FindOne 查询单个文档
func FindOne(collection string, filter interface{}) (*mongo.SingleResult, error) {coll, err := GetCollection(collection)if err != nil {return nil, err}return coll.FindOne(context.Background(), filter), nil
}// Find 查询多个文档(支持分页)
func Find(collection string, filter interface{}, page, pageSize *int64, opts ...*options.FindOptions) (*mongo.Cursor, int64, error) {coll, err := GetCollection(collection)if err != nil {return nil, 0, err}// 获取总文档数total, err := coll.CountDocuments(context.Background(), filter)if err != nil {return nil, 0, err}// 计算总页数var totalPages int64 = 0if page != nil && pageSize != nil && *pageSize > 0 {totalPages = (total + *pageSize - 1) / *pageSize}// 添加分页选项if page != nil && pageSize != nil && *page > 0 && *pageSize > 0 {skip := (*page - 1) * *pageSizeopts = append(opts, options.Find().SetSkip(skip).SetLimit(*pageSize))}cursor, err := coll.Find(context.Background(), filter, opts...)return cursor, totalPages, err
}// Update 更新文档
func Update(collection string, filter interface{}, update interface{}) (*mongo.UpdateResult, error) {coll, err := GetCollection(collection)if err != nil {return nil, err}return coll.UpdateOne(context.Background(), filter, update)
}// Delete 删除文档
func Delete(collection string, filter interface{}) (*mongo.DeleteResult, error) {coll, err := GetCollection(collection)if err != nil {return nil, err}return coll.DeleteOne(context.Background(), filter)
}// Close 关闭连接
func Close() {if Client != nil {Client.Disconnect(context.Background())}
}// GetClient 获取MongoDB客户端实例
func GetClient() *mongo.Client {return Client
}
2. 功能详解
2.1 初始化相关函数
Init()
- 功能:初始化 MongoDB 连接
- 特点:
- 从 GoFrame 配置文件读取配置
- 支持连接池配置
- 支持认证
- 自动测试连接
func Init() error {// ... 配置读取 ...clientOptions := options.Client().ApplyURI(uri).SetAuth(options.Credential{Username: username,Password: password,})// ... 连接创建 ...
}
IsInitialized()
- 功能:检查 MongoDB 客户端是否已初始化
- 使用场景:在执行操作前检查连接状态
2.2 集合操作函数
GetCollection()
- 功能:获取指定名称的集合
- 参数:
- collection: 集合名称
- 返回:
- *mongo.Collection: 集合对象
- error: 错误信息
2.3 CRUD 操作函数
Create()
- 功能:创建新文档
- 使用示例:
doc := map[string]interface{}{"title": "测试标题","content": "测试内容",
}
result, err := mongodb.Create("collection_name", doc)
FindOne()
- 功能:查询单个文档
- 使用示例:
filter := map[string]interface{}{"title": "测试标题"}
result, err := mongodb.FindOne("collection_name", filter)
Find()
- 功能:查询多个文档(支持分页)
- 特点:
- 自动计算总页数
- 支持分页查询
- 支持自定义查询选项
- 使用示例:
page := int64(1)
pageSize := int64(10)
results, totalPages, err := mongodb.Find("collection_name", filter, &page, &pageSize)
Update()
- 功能:更新文档
- 使用示例:
filter := map[string]interface{}{"title": "旧标题"}
update := map[string]interface{}{"$set": map[string]interface{}{"title": "新标题"}}
result, err := mongodb.Update("collection_name", filter, update)
Delete()
- 功能:删除文档
- 使用示例:
filter := map[string]interface{}{"title": "要删除的标题"}
result, err := mongodb.Delete("collection_name", filter)
3. 使用建议
3.1 错误处理
if err := mongodb.Init(); err != nil {g.Log().Fatal(ctx, "MongoDB初始化失败:", err)
}
3.2 连接管理
// 程序启动时初始化
func main() {if err := mongodb.Init(); err != nil {panic(err)}defer mongodb.Close()// ... 其他代码 ...
}
3.3 分页查询
func GetPagedData(page, pageSize int64) {filter := map[string]interface{}{}cursor, totalPages, err := mongodb.Find("collection", filter, &page, &pageSize)if err != nil {// 错误处理return}var results []map[string]interface{}if err = cursor.All(context.Background(), &results); err != nil {// 错误处理return}
}
4. 注意事项
-
连接池配置
- 根据实际需求设置最大/最小连接数
- 合理设置连接空闲超时时间
-
上下文使用
- 建议在操作时传入带超时的上下文
- 避免长时间阻塞操作
-
错误处理
- 所有数据库操作都需要错误检查
- 使用 GoFrame 的日志系统记录错误
-
资源管理
- 及时关闭不需要的游标
- 程序退出时调用 Close() 关闭连接
这个完整的工具包提供了在 GoFrame 框架中使用 MongoDB 的所有基本功能,包括连接管理、CRUD 操作和分页查询等。通过合理使用这些函数,可以轻松实现 MongoDB 相关的各种功能。
相关文章:

goframe开发一个企业网站 MongoDB 完整工具包18
1. MongoDB 工具包完整实现 (mongodb.go) package mongodbimport ("context""fmt""time""github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )va…...

在vue中,根据后端接口返回的文件流实现word文件弹窗预览
需求 弹窗预览word文件,因浏览器无法直接根据blob路径直接预览word文件,所以需要利用插件实现。 解决方案 利用docx-preview实现word文件弹窗预览,以node版本16.21.3和docx-preview版本0.1.8为例 具体实现步骤 1、安装docx-preview插件 …...

动态规划之背包问题
0/1背包问题 1.二维数组解法 题目描述:有一个容量为m的背包,还有n个物品,他们的重量分别为w1、w2、w3.....wn,他们的价值分别为v1、v2、v3......vn。每个物品只能使用一次,求可以放进背包物品的最大价值。 输入样例…...

【Python】 深入理解Python的单元测试:用unittest和pytest进行测试驱动开发
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 单元测试是现代软件开发中的重要组成部分,通过验证代码的功能性、准确性和稳定性,提升代码质量和开发效率。本文章深入介绍Python中两种主流单元测试框架:unittest和pytest,并结合测试驱动开发(TDD)…...

Java集合1.0
1.什么是集合? 集合就是一个存放数据的容器,准确的说是放数据对象引用的容器。 集合和数组的区别 数组是固定长度,集合是可变长度。数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型&…...

Leetcode 336 回文对
示例 1: 输入:words ["abcd","dcba","lls","s","sssll"] 输出:[[0,1],[1,0],[3,2],[2,4]] 解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","sl…...

实现一个可配置的TCP设备模拟器,支持交互和解析配置
前言 诸位在做IOT开发的时候是否有遇到一个问题,那就是模拟一个设备来联调测试,虽然说现在的物联网通信主要是用mqtt通信,但还是有很多设备使用TCP这种协议交互,例如充电桩,还有一些工业设备,TCP这类报文交…...

算法的空间复杂度
空间复杂度 空间复杂度主要是衡量一个算法运行所需要的额外空间,在计算机发展早期,计算机的储存容量很小,所以空间复杂度是很重要的。但是经过计算机行业的迅速发展,计算机的容量已经不再是问题了,所以如今已经不再需…...

自定义协议
1. 问题引入 问题:TCP是面向字节流的(TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列,即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分,它只是确保数据的顺序和完整…...

在 Taro 中实现系统主题适配:亮/暗模式
目录 背景实现方案方案一:CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme?代码示例 方案二:通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序,需求是页面的UI主题想要跟随手机系统的主题适配…...

autogen框架中使用chatglm4模型实现react
本文将介绍如何使用使用chatglm4实现react,利用环境变量、Tavily API和ReAct代理模式来回答用户提出的问题。 环境变量 首先,我们需要加载环境变量。这可以通过使用dotenv库来实现。 from dotenv import load_dotenv_ load_dotenv()注意.env文件处于…...

读《Effective Java》笔记 - 条目9
条目9:与try-finally 相比,首选 try -with -resource 什么是 try-finally? try-finally 是 Java 中传统的资源管理方式,通常用于确保资源(如文件流、数据库连接等)被正确关闭。 BufferedReader reader n…...

【软件入门】Git快速入门
Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…...

nextjs window is not defined
问题产生的原因 在 Next.js 中,“window is not defined” 错误通常出现在服务器端渲染(Server - Side Rendering,SSR)的代码中。这是因为window对象是浏览器环境中的全局对象,在服务器端没有window这个概念。例如&am…...

C语言实现冒泡排序:从基础到优化全解析
一、什么是冒泡排序? 冒泡排序(Bubble Sort)是一种经典的排序算法,其工作原理非常直观:通过多次比较和交换相邻元素,将较大的元素“冒泡”到数组的末尾。经过多轮迭代,整个数组会变得有序。 二…...

windows11下git与 openssl要注意的问题
看了一下自己贴文的历史,有一条重要的忘了写了。 当时帮有位同事配置gitlab,众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题,如配置代理,sshkey,私有库,等等࿰…...

lua除法bug
故事背景,新来了一个数值,要改公式。神奇的一幕出现了,公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…...

Ubuntu下Docker容器java服务往mysql插入中文数据乱码
一、问题描述 1、java服务部署在ubuntu下的docker容器内,但是会出现部分插入中文数据显示乱码,如图所示: 二、解决方案 1、查看mysql是否支持utf8,登录进入Mysql 输入命令: mysql -u root -pshow variables like c…...

C语言根据字符串变量获取/设置结构体成员值
一、背景 在项目中需要根据从数据库中获取的字段与对应的键值付给对应结构体成员上,而c语言中没有类似的反射机制,所以需要实现类似功能。例,从表中查到a 10,在结构体t中,需要将 t.a 10。 二、实现 感谢ChatGPT&…...

Selenium 自动化测试demo
场景描述: 模拟用户登录页面操作,包括输入用户名、密码、验证码。验证码为算数运算,如下: 使用到的工具和依赖: 1. Selenium:pip install selenium 2. 需要安装浏览器驱动:这里使用的是Edge 3…...

LeetCode 111.二叉树的最小深度
题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路:自底向上(归)/自顶向下(递) DF…...

大工C语言作业答案
前言 这里是大连理工大学新版C语言课程MOOC作业的答案。 后期我会把全部的作业答案开源出来,希望对大家有帮助。 第九周第一题 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int B(int i) {int sum 1;while (i > 0){sum i * sum;i--;}return su…...

【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
The game object is deformed when the parent object is in non-uniform scaling. 先来看一下现象 有两个Cube, Cube1(Scale2,1,1),Cube2(Scale1,1,1) 将Cube2拖拽为Cube2的子对象。并且将position设置为(-0.6,1,0&a…...

QT 跨平台实现 SSDP通信 支持多网卡
一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…...

如何寻找适合的HTTP代理IP资源?
一、怎么找代理IP资源? 在选择代理IP资源的时候,很多小伙伴往往将可用率作为首要的参考指标。事实上,市面上的住宅IP或拨号VPS代理IP资源,其可用率普遍在95%以上,因此IP可用率并不是唯一的评判标准 其实更应该关注的…...

数据结构(ArrayList顺序表)
一、引言 1.什么是顺序表 定义: 顺序表是一种基于阵列实现的线性表结构,用连续的存储空间保存表中的数据元素,并按顺序排列。 底层依赖阵列,支持随机访问。元素之间没有额外的连接信息,如指针或链表节点。通过动态扩容…...

直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...

RK3588-LinuxSDK安装
安装依赖软件 执行如下命令,安装 LinuxSDK 开发包依赖软件。 备注:安装过程中,请保证 Ubuntu 可正常访问互联网,若提示"*** is already the newest version ***"表示该软件已安装,请忽略。 Host# sudo apt-get install -y git ssh make gcc libssl-dev \ liblz…...

MATLAB 中有关figure图表绘制函数设计(论文中常用)
在撰写论文时,使用 MATLAB 导出的图像常常因大小和格式不统一,导致投稿时编辑部频繁退稿,要求修改和调整。这不仅浪费时间,也增加了工作量。为了减少这些麻烦,可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…...

Unity UGUI原理剖析
UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...