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

devtools/2024/11/25 0:50:10/

mongodbgo_2">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 相关的各种功能。


http://www.ppmy.cn/devtools/136692.html

相关文章

量子卷积神经网络

量子神经网络由量子卷积层、量子池化层和量子全连接层组成 量子卷积层和量子池化层交替放置,分别实现特征提取和特征降维,之后通过量子全连接层进行特征综合 量子卷积层、量子池化层和量子全连接层分别由量子卷积单元、量子池化单元和量子全连接单元组…

C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合

在C#编程中,二维数组(或矩阵)是一种重要的数据结构,它不仅能够高效地存储和组织数据,还能通过其行、列和交叉点(备注:此处相交处通常称为“元素”或“单元格”,代表二维数组中的一个…

网络安全(骇客)—技术学习

**读者福利 |*** 🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0…

一线大厂面试集锦

String 为什么要设计成不可变的 String被设计成不可变的有以下几个原因: 线程安全:由于String是不可变的,多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全1. 的。 2.缓存Hash值:由于String是不可变的,它的hashcode可以…

【Anomaly Detection论文阅读记录】PaDiM与PatchCore模型的区别与联系

PaDiM与PatchCore模型的区别与联系 背景介绍 PADIM(Pretrained Anomaly Detection via Image Matching)和 PatchCore 都是基于深度学习的异常检测方法,主要用于图像异常检测,尤其是在无监督学习设置下。 PADIM 是一种通过利用预训练的视觉模型(例如,ImageNet预训练的卷…

【东莞石碣】戴尔R740服务器维修raid硬盘问题

1:石碣某塑料工厂下午报修一台戴尔R740服务器硬盘故障,催的还比较着急。 2:工程师经过跟用户确认故障的问题以及故障服务器型号和故障硬盘型号,产品和配件确认好后,公司仓库确认有该款硬盘现货,DELL 12T S…

嵌入式QT中组播功能的具体实现

大家好,今天主要给大家分享一下,如何利用QT实现组播功能与实现。 第一:QT组播功能简介 一种是源主机和目标主机两台主机之间进行的“一对一”的通讯方式,即单播,第二种是一台源主机与网络中所有其他主机之间进行的通讯,即广播。那么,如果需要将信息从源主机发送到网络中…

计算机网络:运输层 —— TCP 的超时重传机制

文章目录 TCP 的超时重传超时重传时间的选择重传策略与拥塞控制的关联 TCP 的超时重传 TCP 的超时重传是保证数据可靠传输的重要机制之一 保证数据可靠性:通过超时重传机制,即使在网络状况不佳,出现数据包丢失等情况时,也能够确保…