GoFrame MongoDB 使用指南
GoFrame MongoDB 使用指南
1. 安装依赖
# 安装官方MongoDB驱动
go get -u go.mongodb.org/mongo-driver/mongo
go get -u go.mongodb.org/mongo-driver/mongo/options
go get -u go.mongodb.org/mongo-driver/bson
2. MongoDB 连接示例
package mainimport ("context""log""time""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)func ConnectMongoDB() (*mongo.Client, error) {// 设置客户端连接配置clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")// 设置连接超时ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()// 连接到MongoDBclient, err := mongo.Connect(ctx, clientOptions)if err != nil {return nil, err}// 验证连接err = client.Ping(ctx, nil)if err != nil {return nil, err}return client, nil
}
3. 数据操作示例
package mainimport ("context""log""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)type User struct {ID string `bson:"_id,omitempty"`Username string `bson:"username"`Email string `bson:"email"`Age int `bson:"age"`CreateAt time.Time `bson:"create_at"`
}// 插入数据
func InsertUser(client *mongo.Client, user User) error {collection := client.Database("testdb").Collection("users")_, err := collection.InsertOne(context.Background(), user)return err
}// 查询数据
func FindUserByUsername(client *mongo.Client, username string) (*User, error) {collection := client.Database("testdb").Collection("users")var user Usererr := collection.FindOne(context.Background(), bson.M{"username": username}).Decode(&user)if err != nil {return nil, err}return &user, nil
}// 更新数据
func UpdateUser(client *mongo.Client, username string, update bson.M) error {collection := client.Database("testdb").Collection("users")_, err := collection.UpdateOne(context.Background(), bson.M{"username": username},bson.M{"$set": update},)return err
}// 删除数据
func DeleteUser(client *mongo.Client, username string) error {collection := client.Database("testdb").Collection("users")_, err := collection.DeleteOne(context.Background(), bson.M{"username": username})return err
}// 复杂查询
func ComplexQuery(client *mongo.Client) ([]User, error) {collection := client.Database("testdb").Collection("users")// 查询年龄大于18的用户cursor, err := collection.Find(context.Background(), bson.M{"age": bson.M{"$gt": 18},})if err != nil {return nil, err}defer cursor.Close(context.Background())var users []Userif err = cursor.All(context.Background(), &users); err != nil {return nil, err}return users, nil
}
4. 与GoFrame集成
虽然GoFrame的gdb不直接支持MongoDB,但你可以在GoFrame应用中使用官方MongoDB驱动:
package serviceimport ("github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo"
)type MongoService struct {client *mongo.Client
}func (s *MongoService) Init() error {client, err := ConnectMongoDB()if err != nil {g.Log().Error(context.Background(), "MongoDB连接失败:", err)return err}s.client = clientreturn nil
}func (s *MongoService) GetCollection(dbName, collectionName string) *mongo.Collection {return s.client.Database(dbName).Collection(collectionName)
}
5. 注意事项
- 使用官方MongoDB驱动
- 正确管理数据库连接
- 使用上下文(Context)控制超时
- 添加适当的错误处理
- 考虑连接池和性能优化
6. 复杂查询示例
// 复杂条件查询
func ComplexQuery(ctx context.Context) {// 年龄大于18且邮箱域名为gmail的用户users, err := g.Model("users").Ctx(ctx).Where("age", ">", 18).WhereLike("email", "%@gmail.com").Order("create_at DESC").Limit(10).All()// 聚合查询result, err := g.Model("users").Ctx(ctx).Fields("age", "COUNT(*) as count").Group("age").Having("count > 5").All()
}
7. 事务处理
func TransactionExample(ctx context.Context) error {return g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {// 执行多个数据库操作_, err1 := tx.Model("users").Data(g.Map{"username": "newuser","email": "newuser@example.com",}).Insert()_, err2 := tx.Model("logs").Data(g.Map{"action": "user_created",}).Insert()// 任何一个操作失败都会回滚if err1 != nil || err2 != nil {return errors.New("transaction failed")}return nil})
}
8. 性能优化建议
- 使用索引
- 避免返回大量数据
- 使用投影减少网络传输
- 合理使用缓存
9. 错误处理
func ErrorHandling(ctx context.Context) {user, err := dao.User.FindByUsername(ctx, "example")if err != nil {switch {case err == g.ErrRecordNotFound:// 处理未找到记录g.Log().Error(ctx, "User not found")case g.IsDBError(err):// 处理数据库错误g.Log().Error(ctx, "Database error:", err)default:// 其他未知错误g.Log().Error(ctx, "Unexpected error:", err)}}
}
总结
GoFrame 提供了强大且简洁的 MongoDB 操作方式,通过抽象层屏蔽了底层实现细节,使开发者可以专注于业务逻辑。
相关文章:
GoFrame MongoDB 使用指南
GoFrame MongoDB 使用指南 1. 安装依赖 # 安装官方MongoDB驱动 go get -u go.mongodb.org/mongo-driver/mongo go get -u go.mongodb.org/mongo-driver/mongo/options go get -u go.mongodb.org/mongo-driver/bson2. MongoDB 连接示例 package mainimport ("context&qu…...
Cpp::静态 动态的类型转换全解析(36)
文章目录 前言一、C语言中的类型转换二、为什么C会有四种类型转换?内置类型 -> 自定义类型自定义类型 -> 内置类型自定义类型 -> 自定义类型隐式类型转换的坑 三、C强制类型转换static_castreinterpret_castconst_castdynamic_cast 四、RTTI总结 前言 Hell…...
4.flask-SQLAlchemy,表Model定义、增删查改操作
介绍 SQLAlchemy是对数据库的一个抽象 开发者不用直接与SQL语句打交道 Python对象来操作数据库 SQLAlchemy是一个关系型数据库 安装 flask中SQLAlchemy的配置 from flask import Flask from demo.user_oper import userdef create_app():app Flask(__name__)# 使用sessi…...
基于 WEB 开发的手机销售管理系统设计与实现内容
标题:基于 WEB 开发的手机销售管理系统设计与实现 内容:1.摘要 摘要:随着智能手机的普及和电子商务的快速发展,手机销售行业面临着越来越多的挑战和机遇。为了提高销售效率和管理水平,本文设计并实现了一个基于 WEB 的手机销售管理系统。该系…...
JavaScript 验证 API:全面解析与实战指南
JavaScript 验证 API:全面解析与实战指南 引言 随着互联网技术的不断发展,前端开发领域的重要性日益凸显。JavaScript 作为前端开发的核心技术之一,其功能性和可扩展性得到了广泛关注。验证功能是JavaScript中不可或缺的一部分,它保证了用户输入数据的正确性和有效性。本…...
20250122-正则表达式
1. 正则标记 表示一位字符:\\ 表示指定的一位字符:x 表示任意的一位字符:. 表示任意一位数字:\d 表示任意一位非数字:\D 表示任意一个字母:[a-zA-Z](大写或小写) 表示任意一个…...
SpringBoot3+Vue3开发学生选课管理系统
功能介绍 分三个角色登录:学生登录,老师登录,教务管理员登录,不同用户功能不同! 1.学生用户功能 选课记录,查看选课记录,退选。选课管理,进行选课。通知管理,查看通知消…...
Effective C++ 规则47: 请使用 Traits Class 表现类型信息
1、背景 C 是一种静态类型语言,类型的特性在编译期就可以被识别和操作。为了更好地利用编译期信息来编写高效、灵活、可维护的代码,C 提供了一些技术来“萃取”或“提取”类型的相关信息。即利用 traits 类来封装和提取类型信息,以便在编译期…...
媒体新闻发稿要求有哪些?什么类型的稿件更好通过?
为了保证推送信息的内容质量,大型新闻媒体的审稿要求一向较为严格。尤其在商业推广的过程中,不少企业的宣传稿很难发布在这些大型新闻媒体平台上。 媒体新闻发稿要求有哪些?就让我们来了解下哪几类稿件更容易过审。 一、媒体新闻发稿要求有哪…...
“AI教学实训系统:打造未来教育的超级引擎
嘿,各位教育界的伙伴们,今天我要跟你们聊聊一个绝对能让你们眼前一亮的教学神器——AI教学实训系统。作为资深产品经理,我可是亲眼见证了这款系统如何颠覆传统教学,成为未来教育的超级引擎。 一、什么是AI教学实训系统?…...
基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【2024年华为OD机试】(A卷,200分)- 查找树中元素 (JavaScriptJava PythonC/C++)
一、问题描述 题目解析 题目描述 题目要求根据输入的坐标 (x, y) 在树形结构中找到对应节点的内容值。其中: x 表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依此类推。y 表示节点在该层内的相对偏移,从左至右,第一个节点偏移为0,第二个节点偏移为1,…...
Pyecharts图表交互功能提升
在数据可视化中,交互功能可以极大地提升用户体验,让用户能够更加深入地探索数据。Pyecharts 提供了多种强大的交互功能,本篇将重点介绍如何使用缩略轴组件、配置图例交互,让我们的数据可视化作品更加生动有趣。 一、缩略轴组件使…...
用layui表单,前端页面的样式正常显示,但是表格内无数据显示(数据库连接和获取数据无问题)——已经解决
这是我遇到的错误 原因:后端控制台的数据格式没有设置清楚 解决:1、加注释 ResponseBody ,确保返回的是json数据。 2、要传三个参数到前端,如下图第二个红色框框所示。因为layui框架代码如果未修改,默认要传入这三个…...
单片机基础模块学习——按键
一、按键原理图 当把跳线帽J5放在右侧,属于独立按键模式(BTN模式),放在左侧为矩阵键盘模式(KBD模式) 整体结构是一端接地,一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…...
elk 安装
创建elk网络 docker network create -d bridge elkelasticsearch 创建目录 mkdir -p /data/elasticsearch/{conf,logs,data,plugins}vim /data/elasticsearch/conf/elasticsearch.ymlcluster.name: "es-cluster" network.host: 0.0.0.0 xpack.security.enabled: tr…...
2025年1月22日(什么是扫频)
扫频(Sweep Frequency)是一种信号处理技术,通常用于系统识别、频率响应分析和特性测试。它通过发送一个频率逐渐变化的信号(通常是正弦波或线性调频信号)来激励系统,然后测量系统的响应。这种方法可以帮助我…...
mybatis是什么?有什么作用?mybatis的简单使用
mybatis是什么? MyBatis 是一个持久层框架。 有什么作用? 简化了对数据库数据的操作。 如何简化数据操作的? MyBatis 通过提供 SQL 映射、动态 SQL、结果映射、事务管理等功能,我们直接去用就可以了。 怎么使用?&…...
webpack 打包自己的--windows
第一步安装node 1、安装nodejs:https://nodejs.org/zh-cn/download/releases/ 一、Window系统配置: 打开命令窗口,进入当前工程目录 npm配置淘宝镜像:npm config set registry http://registry.npm.taobao.org/ npm安装parcel-bundler:npm install -g parcel-bund…...
微服务学习-Nacos 注册中心实战
1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心? 服务与服务之间调用需要有服务发现功能;例如订单服务调用库存服务,库存服务如果有多个,订单服务到底调用那个库存服务呢(负载均衡器)࿰…...
MySQL数据库 - 语法知识
一 数据模型 1 关系型数据库管理系统(RDBMS) 概念:建立在关系模型基础上,有多张相互连接的二维表组成的数据库。 特点: 使用表存储数据,格式统一,便于维护。使用SQL语言操作,标准…...
Zookeeper(28)Zookeeper的线性化写入和顺序一致性读是什么?
Zookeeper 是一个分布式协调服务,它在设计上提供了强一致性的保证,其中包括线性化写入和顺序一致性读。这两种一致性模型确保了在分布式系统中数据的一致性和操作的确定性。 线性化写入(Linearizable Writes) 线性化写入保证在任…...
kamailio-5.8.4-centos9编译
安装必要的依赖包 在开始编译之前,你需要安装编译 Kamailio 所需的一些基础依赖包: dnf install -y make gcc gcc-c flex bison libxml2-devel openssl-devel sqlite-devel mysql-devel pcre-devel libcurl-devel下载并解压 Kamailio 源码包 假设你已经…...
有限元分析学习——Anasys Workbanch第一阶段笔记(15)接触间隙处理与赫兹接触
目录 0 序言 1 接触的间隙处理 1.1 结果对比 1.2 处理方法 2 赫兹接触 0 序言 本章主要介绍间隙出现时的三种解决方法,齿轮点蚀/表面剥落涉及的赫兹接触的一些理论知识。 1 接触的间隙处理 在实际产品过程中,很多时候由于设计问题,原本…...
Angular 2 表单深度解析
Angular 2 表单深度解析 引言 Angular 2作为现代前端开发的框架之一,以其灵活性和强大的功能赢得了众多开发者的青睐。在Angular 2中,表单处理是其中一个重要且复杂的部分。本文将深入解析Angular 2的表单,从基础知识到高级应用,旨在帮助开发者更好地理解和运用Angular 2…...
查询本周一到周五的数据
查询sql SELECT CASEWHEN TO_CHAR(T.BEGINDATE, D) 2 THEN 周一WHEN TO_CHAR(T.BEGINDATE, D) 3 THEN 周二WHEN TO_CHAR(T.BEGINDATE, D) 4 THEN 周三WHEN TO_CHAR(T.BEGINDATE, D) 5 THEN 周四WHEN TO_CHAR(T.BEGINDATE, D) 6 THEN 周五END AS DAY_NAME,T.COLUMN1,T.COL…...
【Linux】命令为桥,存在为岸,穿越虚拟世界的哲学之道
文章目录 Linux基础入门:探索操作系统的内核与命令一、Linux背景与发展历史1.1 Linux的起源与发展1.2 Linux与Windows的对比 二、Linux的常用命令2.1 ls命令 - "List"(列出文件)2.2 pwd命令 - "Print Working Directory"(…...
【技术】TensorRT 10.7 安装指南(Ubuntu22.04)
原文链接:https://mengwoods.github.io/post/tech/008-tensorrt-installation/ 本文安装的版本如下: Ubuntu 22.04 Nvidia Driver 538.78 CUDA 12.2 cuDNN 8.9.7 TensorRT 10.7 安装前的准备(可选) 在安装新版本之前…...
2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)
2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1样例代码运行结果&…...
DDD架构实战第七讲总结:分层模型和代码组织
云架构师系列课程之DDD架构实战第七讲总结:分层模型和代码组织 一、引言 在前几讲中,我们介绍了领域驱动设计(DDD)的基本构造块和生命周期模型中的聚合。本讲将重点讨论如何将这些构造块和代码组织起来,探讨分层架构和六边形模型,以及如何组织代码结构。 二、工厂和资…...
