使用MongoDB进行复杂业务查询的实践
扫描二维码随身看资讯
使用手机 二维码应用 扫描右侧二维码,您可以
1. 在手机上细细品读~
2. 分享给您的微信好友或朋友圈~
MongoDB是一种非关系型数据库,随着其功能的不断增强,许多项目为了快速扩展,甚至直接使用MongoDB来替代传统的数据库进行数据持久化。
尽管MongoDB在支持具体业务时没有问题,但由于它是文档型数据库,拥有一套独立的语法,不再支持传统的SQL。
开发人员在实际开发过程中发现,由于语法问题,在处理复杂的业务查询时,不知该如何下手,感到力不从心。
在这里我总结了一下接触到的使用场景:
如果是简单的业务,那么我们直接使用spring JPA来实现就可以,比如这些操作:
1、创建
2、删除
3、修改
4、简单的查询
因为这些语句的逻辑往往不是很复杂,JPA完全可以胜任,而且还清晰直观。
如果是复杂的场景,我们就使用MongoTEMPlate 来组织条件逻辑:
假设背景是有张Student 表,结构如下:
我们已经预先插入了下边的数据:
(1)先来一个简单的
单条件查询:
输出如下:
观察代码,我们发现需要首先创建一个Query 实例,表示是一个查询动作。
query 对象,继续补充一个Criteria 实例。Criteria 英[kraɪ'tɪəriə] 译为比标准、准则、尺度。我们可以直接理解为查询条件。
注意Criteria 实例是由 Criteria.where 方法创建出来的。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )这是一个简单工厂,参数为要查询的表的列名(文档的字段)。再跟一个in() ,表示列的in 操作,in() 中跟的是in操作的值。
最后直接用mongoTemplate 实例执行find 操作就好,条件为查询逻辑和表对应的类文件。
我们这里使用的是in 操作,除此之外,常用的还有
方法 | 作用 | 类比sql |
gt | 表示 大于 | > |
gte | 表示 大于等于 | >= |
lt | 表示 小于 | < |
lte | 表示 小于等于 | <= |
ne | 表示 不等于 | != |
nin | 表示 不属于 | not in |
is | 表示等于 | = |
regex |
表示 like (注意后面跟正则表达式,如 "^.*" + queryKeyWord + ".*$") | like ‘%关键字%’ |
这些都是基本操作,有sql经验的同学肯定明白具体怎么使用。
我们再补充一个模糊查询的例子:
输出如下:
(2)接着来看一个相对复杂点的组合条件:
两个或条件,类似于SQL中的: A表达式 OR B表达式,代码如下
执行效果如下:
我们创建好两个Criteria的简单条件之后,再创建一个新的Criteria 实例,用一个or操作将二者关联起来.
query 接收最新的Criteria 实例,然后执行查询即可。
这里的写法类似于sql中的
where name like "%ong%" or age != 15
如果是两个AND 条件,类似于SQL中的: (防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )A表达式 AND B表达式,用法和or的使用方法是一样的 。这里就不举例了,
我们这里写一个复杂的用法:
输出如下:
这里的写法类似于sql中的
where ( description = "nice" and classNo in (1 ,2 ,3) ) or ("name like %ong%" or age != 15)
总体来看: 一个Criteria 实例,就是一个查询条件。
我们可以通过 or、and 操作来不断的组合生成一个新的Criteria实例,也就是一个新的查询条件 ,并且可以以此查询条件继续组合生成更高级的Criteria,以此不断的类推。
这个过程就像垒积木一样:
(3) 接着我们整合下分页功能,并且以班级排序
注意分页时,页码数是从0开始,所以要-1。同时排序使用Sort生成sort的对象,包含排序方式和字段,并且这里支持多级排序。
整体代码如下:
输出如下:
- 帮派沙盒 MOD版
- 奔跑吧跑男小镇
- 永恒之夜官方正版
- 战斗派对最新版
- 勇者之海 手游
- 植物大战僵尸 全模式版
- 猫友圈猫咪的旅行 中文版
- 真实停车模拟器2 最新版
- 亚瑟王传说崛起安卓版
- 御剑红尘买断服
- 加油站超市游戏
- 天下布魔工口服
- 我的世界 珍妮模组完整版无遮瑕安装
- 王国80年代官方正版
- OSG开发笔记(三十六):osg3.4.0基于windows平台msvc2017x64编译器编译并移植Demo
- 基于磁盘的B+树:数据访问与优化
- 大模型应用开发初探 : 基于Coze创建Agent
- OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接
- 基于SpringAI搭建系统,解决GPT接口批量化请求问题
- 如何基于香橙派AIpro对视频/图像数据进行预处理
- 基于门窗行业ERP一般找哪个公司做的多呀?
- 基于感康的主要成分有哪些,感康说明书中有写吗?
- 基于UshopERP软件公司信息哪里看?
- 基于艾美优品生活馆店铺有人知道吗?
- 在基于统信服务器操作的环境中,使用virt-manager管理虚拟机有哪些常见的操作和管理步骤?
- 魔兽世界9.2:基于统计数据的超级猴子球攻略
- 1
天天酷跑3d单机游戏
- 2
怪物猎人Puzzles艾露岛
- 3
暴富渔翁
- 4
猎鱼达人VIVO版本下载 v3.7.0.0 安卓版
- 5
植物大战僵尸幼儿园版 安卓官方版
- 6
希望之村2来生
- 7
我的汤姆猫2万圣节版本下载 v3.7.0.568 安卓版
- 8
夏哈塔遭难的一天 安卓免费版
- 9
火柴人给我死最新版
- 10
像素文明 最新版
- 1
加查之花 正版
- 2
爪女孩 最新版
- 3
新麻将连连看 消消乐
- 4
捕鱼大世界 无限金币版
- 5
企鹅岛 官方正版中文版
- 6
内蒙打大a真人版
- 7
跳跃之王手游
- 8
情商天花板 2024最新版
- 9
烦人的村民 手机版
- 10
球球英雄 手游