goframe开发一个企业网站 MongoDB 完整工具包19

news2024/11/24 11:34:51

1. MongoDB 工具包完整实现 (mongodb.go)

package mongodb

import (
    "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.Client
    Database 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 = 0
    if page != nil && pageSize != nil && *pageSize > 0 {
        totalPages = (total + *pageSize - 1) / *pageSize
    }

    // 添加分页选项
    if page != nil && pageSize != nil && *page > 0 && *pageSize > 0 {
        skip := (*page - 1) * *pageSize
        opts = 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 相关的各种功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter:AnimatedIcon图标动画,自定义Icon通过延时Interval,实现交错式动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// late延迟初始化 AnimationControllerlate AnimationController _controller;overridevoid initStat…

【网络系统管理】2023年全国职业院校技能大赛:组策略--10套题组合--1

1、限制访问C盘; (1)搜索《我的电脑》 (2)用户配置\策略\管理模板\Windows组件\文件资源管理器 2、禁止运行run.exe; (1)搜索《应用程序》 (2)用户配置\策略\管理模板\系统

【LeetCode每日一题】——485.最大连续 1 的个数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 LeetCode 三【题目编号】 485.最大连续 1 的个数 四【题目描述】 给定…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…

助力3C数码企业实现泛微OA与金蝶EAS的高效对接

助力3C数码企业实现泛微OA与金蝶EAS的高效对接 在3C数码行业&#xff0c;数据的实时性和准确性对于企业的运营至关重要。轻易云数据集成平台&#xff0c;作为业界领先的无代码软件集成解决方案&#xff0c;致力于帮助3C数码企业实现系统间的无缝对接&#xff0c;提升数据管理效…

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools

原因 想用 apt-get download 存到本地 / NAS上&#xff0c;减少网络流浪。 看到 VMware 上的确实有 ubuntu&#xff0c;只是版本是16。 ubuntu 版本比较&#xff1a;LTS vs RR LTS: Long-Term Support 长周期支持&#xff0c; 一般每 2 年更新&#xff0c;会更可靠与更稳定…

python之使用django框架开发web项目

本问将对django框架在python的web项目中的使用进行介绍,有不对之处,烦请指正。 首先使用创建一个django工程(本示例中使用pycharm2024+python3.12),名称和项目保存路径根据自己的需要自行修改,新手直接默认本机环境就好(关于conda将会另开一篇进行讲解。),最后点击cre…

【大数据学习 | Spark-Core】Spark的分区器(HashPartitioner和RangePartitioner)

之前学过的kv类型上面的算子 groupby groupByKey reduceBykey sortBy sortByKey join[cogroup left inner right] shuffle的 mapValues keys values flatMapValues 普通算子&#xff0c;管道形式的算子 shuffle的过程是因为数据产生了打乱重分&#xff0c;分组、排序、join等…

GPT系列文章

GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结&#xff1a;GPT 是一种半监督学习&#xff0c;采用两阶段任务模型&#xff0c;通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…

QT 网络编程 数据库模块 TCP UDP QT5.12.3环境 C++实现

一、网络编程 1. 模块引入 QT network 2. 头文件 #include <QTcpServer> //TCP服务端使用 #include <QTcpSocket> //TCP服务器和客户端都使用 3. TCP网络编程流程 1) 服务端 实例化QTcpServer对象----------------------------->socket 进入监听状态…

Cmakelist.txt之Linux-redis配置

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(redis_linux_test LANGUAGES C) ​ ​ ​ add_executable(redis_linux_test main.c) ​ # 设置hiredis库的头文件路径和库文件路径 set(Hiredis_INCLUDE_DIR /usr/local/include/hiredis) set(Hiredis_LIBRA…

使用flink编写WordCount

1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 流程图&#xff1a; DataStream API开发 //nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/overview/ 添加依赖 <properties>&l…

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

基于AXI PCIE IP的FPGA PCIE卡示意图

创作不易&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/csdn_gddf102384398/article/details/143926217 上图中&#xff0c;在FPGA PCIE卡示意图内&#xff0c;有2个AXI Master设备&#xff0c;即&#xff1a;PCIE到AXI4-Full-Master桥、AXI CDMA IP&#xff1…

学习与理解LabVIEW中多列列表框项名和项首字符串属性

多列列表框控件在如下的位置&#xff1a; 可以对该控件右击&#xff0c;如下位置&#xff0c;即可设置该控件的显示项&#xff1a; 垂直线和水平线指的是上图中组成单元格的竖线和横线&#xff08;不包括行首列首&#xff09; 现在介绍该多列列表框的两个属性&#xff0c;分别…

使用 前端技术 创建 QR 码生成器 API1

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…

UE5材质篇5 简易水面

不得不说&#xff0c;UE5里搞一个水面实在是相比要自己写各种反射来说太友好了&#xff0c;就主要是开启一堆开关&#xff0c;lumen相关的&#xff0c;然后稍微连一些蓝图就几乎有了 这里要改一个shading model&#xff0c;要这个 然后要增加一个这个node 并且不需要连接base …

计算机网络 实验六 组网实验

一、实验目的 通过构造不同的网络拓扑结构图并进行验证&#xff0c;理解分组转发、网络通信及路由选择的原理&#xff0c;理解交换机和路由器在子网划分中的不同作用。 二、实验原理 组网实验是指将多个计算机通过网络连接起来&#xff0c;实现数据的共享和通信。 组网需要考虑…

LeetCode 力扣 热题 100道(八)相交链表(C++)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

Spring |(四)IoC/DI配置管理第三方bean

文章目录 &#x1f4da;数据源对象管理&#x1f407;环境准备&#x1f407;实现Druid管理&#x1f407;实现C3P0管理 &#x1f4da;加载properties文件&#x1f407;第三方bean属性优化&#x1f407;读取单个属性 学习来源&#xff1a;黑马程序员SSM框架教程_SpringSpringMVCMa…