编辑
2023-11-30
实用工具
00
请注意,本文编写于 490 天前,最后修改于 485 天前,其中某些信息可能已经过时。

目录

MongoDB简介
应用场景
与关系型数据库术语对照
Mongodb条件构造器使用
Query对象方法
Criteria 对象方法
MongoDB搭建
windows-msi形式
window-zip形式
安装MongoDB可视化管理工具
安装MongoDB shell
引入SpringBoot项目
pom依赖
application.yml配置
简单实战
可能会出现的问题

MongoDB简介

  • MongoDB是一个基于分布式文件存储的数据库
  • 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
  • Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

应用场景

  • 社交场景,使用 MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
  • 游戏场景,使用 MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
  • 物流场景,使用 MongoDB存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来
  • 物联网场景,使用 MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
  • 视频直播,使用 MongoDB存储用户信息、点赞互动信息等。

这些应用场景中,数据操作方面的共同特点是:

  1. 数据量大
  2. 写入操作频繁(读写都很频繁)
  3. 价值较低的数据,对事务性要求不高

对于这样的数据,我们更适合使用 MongoDB来实现数据的存储。

与关系型数据库术语对照

SQL术语MongoDB术语
databasedatabase
tablecollection
rowdocument
columnfield

Mongodb条件构造器使用

  1. 创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)代码演示如下:
  2. Query query = new Query(Criteria.where("id").is(id));
  3. 精准条件:criteria.and("key").is("条件")
  4. 模糊条件:criteria.and("key").regex("条件")
  5. 封装条件:query.addCriteria(criteria)
  6. 大于:Criteria gt = Criteria.where("key").gt("条件")
  7. 小于:Criteria lt = Criteria.where("key").lt("条件")
  8. 范围查询:query.addCriteria(Criteria.where("key").gte("条件").lte("条件")

Query对象方法

  1. addCriteria(Criteria criteria) 添加一个Criteria对象作为查询条件。
  2. limit(int limit) 设置查询结果的限制,指定返回的文档数量
  3. isSorted() 用于检查查询结果是否已排序
  4. skip() 设置查询结果跳过的文档数量
  5. withHint() 配置查询以在执行时使用给定的提示。 hint可以是索引名称或 json Document表示形式
  6. with(Pageable pageable) 在Query实例上设置给定的分页信息。将透明地设置skip和limit以及应用使用Pageable定义的Sort实例。
  7. with(Sort sort)向Query实例添加Sort 排序
  8. getSkip() 获取要跳过的文档数
  9. getLimit() 获取要返回的最大文档数。
  10. comment(String comment)向传播到配置文件日志的查询添加注释
  11. cursorBatchSize(int batchSize) 设置每个响应批次中返回的文档数。 使用 0(零)表示没有限制。负限制会在返回单个批次后关闭游标,指示服务器客户端不会请求后续批次。

Criteria 对象方法

  1. where(String key) 相当于sql的where后输入字段名,key是字段名
  2. and(String key) and方法
  3. is(Object value) 相等 相当于eq
  4. ne(Object value) 不相等
  5. lt(Object value) 小于
  6. lte(Object value) 小于或者等于
  7. gt(Object value) 大于
  8. gte(Object value) 大于或者等于'
  9. in(Object... values) 包含
  10. in(Collection<?> values) 包含
  11. nin(Object... values) 不包含
  12. nin(Collection<?> values) 不包含
  13. mod(Number value, Number remainder) 模运算
  14. all(Object... values) 数据库的数组类型里的元素同时等于values里的值
  15. all(Collection<?> values) 含义如上
  16. size(int size) 查询数组大小为多少
  17. exists(boolean value) 字段内容是否存在 true存在 false不存在
  18. type(int typeNumber) 查找文档值为xx的信息
  19. type(Type... types) 如上
  20. not() 不包含
  21. not( Object value) 不包含
  22. regex(String regex) 正则表达式 可以用来模糊查询,全匹配
  23. regex(String regex, @Nullable String options) options选项
  24. regex(Pattern pattern) is(Object)的语法糖明显表明我们创建了一个正则表达式谓词。
  25. withinSphere(Circle circle) 根据地理坐标操作
  26. elemMatch(Criteria criteria) 包含一个数组字段,该字段至少有一个元素与所有 指定的查询条件
  27. alike(Example<?> sample) 使用给定对象作为模式创建标准。
  28. orOperator(Criteria... criteria) or 相当于sql中的 or(criteria)or(criteria),方法传入多个criteria那这些逻辑之间都是or的关系
  29. norOperator(Criteria... criteria) 返回不满足or逻辑的内容
  30. andOperator(Criteria... criteria) and 方法传入多个criteria那这些逻辑之间都是and的关系

MongoDB搭建

windows-msi形式

官网下载,选择msi的形式下载文件

双击打开,选择Custom 自定义安装目录比如说D

,选择自己想要的地址,一直next就行了

在最后的页面,安装 "Install MongoDB Compass" 不勾选,否则可能要很长时间都一直在执行安装

window-zip形式

官网下载,选择zip的形式下载文件,解压到本地

进入解压后的文件夹,和bin目录同级下创建data和logs文件夹

打开cmd控制台以管理员模式进入这个文件夹的bin目录,启动命令来指定mongdb的数据及日志目录

mongod --install --dbpath D:\MongoDB\mongodb-win32-x86_64-windows-7.0.4\data --logpath D:\MongoDB\mongodb-win32-x86_64-windows-7.0.4\logs\mongodb.log

如果没有报错信息说明命令执行成功,win+r输入services.msc,进入windows服务查看有没有MongoBD服务,有服务就显示成功

再运行启动服务命令

net start mongodb

会显示服务启动成功

输入http://localhost:27017/ 看到一下内容说明服务启动正常

It looks like you are trying to access MongoDB over HTTP on the native driver port.

管理服务的其他语法

mongod --install --dbpath 数据目录 --logpath 日志目录\日志名称 #创建服务 mongod --remove #卸载服务 net start mongodb #启动服务 net stop mongodb #关闭服务 mongod #是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。

安装MongoDB可视化管理工具

官网下载 点击Download下载即可,下载完成后得到压缩包,双击运行exe文件

点击connect链接,上面是默认链接地址端口

登录成功后点击+号新建数据库和表 到此基础工作准备完成

安装MongoDB shell

官网下载

解压到需要的文件夹,进入bin目录双击mongosh.exe即可启动,就能运行mongo命令 比如说增加超级管理账号,数据库账号等等功能

引入SpringBoot项目

pom依赖

pom
<!--集成mongodb--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>

application.yml配置

yml
spring: data: mongodb: host: 127.0.0.1 port: 27017 database: test

简单实战

首先需求目的是改造字典检索,原来的字典检索是通过用户的输入码,拼成redis的key,如果key有值就返回,没有值就查询数据库,并添加到redis中,原来的情况有两种问题首先就是字典内容很多,容易产生大key,其次就是用输入码拼接的方式产生的key,由于用户输入内容变动很大,所以redis经常会穿透,所以我们进行改造将redis的方式改为mongodb检索

首先创建一个mongo实体对象

java
import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Data @NoArgsConstructor//无参构造 @AllArgsConstructor//全参构造 @Document(collection = "diagnosis_dict")//Document注解表明对应了MongoDB中的表。 public class MgDictEntity { @ApiModelProperty(value="序号") @Id private Long id; @ApiModelProperty(value="编码") @Field("code") private String code; @ApiModelProperty(value="名称") @Field("name") private String name; @ApiModelProperty(value="助记词输入码") @Field("input_code") private String inputCode; }

编写mongoDB服务接口继承MongoRepository 在这个接口里编写一个模糊查询code\name \inputCode的接口,使用时直接调用接口

java
import com.ewell.medqc.rec.entity.MgDiagDictEntity; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import java.util.List; public interface IMongoDbService extends MongoRepository<MgDictEntity, String> { @Query("{\"$or\": [{code: /?0/},{name: /?0/},{input_code:/?0/}]}") List<MgDictEntity> findByCodeOrNameOrInputCodeRegex(String input); }

或者直接使用MongoTemplate,使用Query条件构造器编写查询条件,表达含义和上面一样

java
Query query=new Query(); query.addCriteria(new Criteria().orOperator( Criteria.where("code").regex(request.getInputCode()), Criteria.where("name").regex(request.getInputCode()), Criteria.where("input_code").regex(request.getInputCode()) )); //增加排序 Sort sort=null; if ("asc".equals(dir)){ List<Sort.Order> orders =new ArrayList<>(); orders.add(new Sort.Order( Sort.Direction.ASC,colum)); sort=Sort.by(orders); }else if ("desc".equals(dir)){ List<Sort.Order> orders =new ArrayList<>(); orders.add(new Sort.Order( Sort.Direction.DESC,colum)); sort=Sort.by(orders); } query.with(sort); query.limit(500); List<MgDictEntity> list=mongoTemplate.find(query,MgDictEntity.class); return list;

编写一个Runner,实现的目的是服务启动时,清除历史数据,装载最新的字典数据到MongoDB中。

java
@Component public class AutoLoadDictRunner implements CommandLineRunner { Logger logger = LoggerFactory.getLogger(this.getClass()); @Resource private MongoTemplate mongoTemplate; @Resource private IDictService iDictService; @Override public void run(String... args) throws Exception { logger.info("程序启动自动加载字典数据进入mongodb中---------"); delectAllMongoDBDict("diagnosis_dict"); List<DictEntity> dicts=iDictService.list(); try { List<MgDictEntity> List = BeanUtil.copyToList(dicts, DictEntity.class); mongoTemplate.insert(list,MgDictEntity.class); } catch (Exception e) { e.printStackTrace(); logger.info("mongodb加载诊断字典数据出错-----------"); return; } logger.info("mongodb成功加载诊断字典数据---------"); } public void delectAllMongoDBDict(String dict){ if (mongoTemplate.collectionExists(dict)) { logger.info("清空集合:"+dict); mongoTemplate.dropCollection(dict); }else { mongoTemplate.createCollection(dict); } } }

进阶一点就是把redis和mongodb结合起来,如果不输入内容默认返回值从redis返回,有输入值就通过mongodb查询

可能会出现的问题

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!