当前位置: 首页 > news >正文

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. 注意事项

  1. 连接池配置

    • 根据实际需求设置最大/最小连接数
    • 合理设置连接空闲超时时间
  2. 上下文使用

    • 建议在操作时传入带超时的上下文
    • 避免长时间阻塞操作
  3. 错误处理

    • 所有数据库操作都需要错误检查
    • 使用 GoFrame 的日志系统记录错误
  4. 资源管理

    • 及时关闭不需要的游标
    • 程序退出时调用 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,私有库,等等&#xff0…...

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…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...