MongoDB分析
1.概念
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
在Java、Python中对JSON都有很好的支持,数据从MongoDB中读取出来后,可无需转换直接使用;支持丰富的数据结构,Value可以是普通的整型、字符串、数组、嵌套的子文档,使用嵌套的好处是在MongoDB中仅需一次简单的查询就能够获取到你所需的数据。
MongoDB中数据存储的基本概念是数据库、集合、文档。
文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行,当更有表现力。
集合(collection)可以看作是一个拥有动态模式(dynamic schema)的表。
MongoDB的一个实例可以拥有多个相互独立的数据库(database),每一个数据库都拥有自己的集合。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
2.MongoDB 的应用场景
1、MongoDB事务
MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景。
灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储。
2、多引擎支持各种强大的索引需求
- 支持地理位置索引
- 可用于构建各种O2O应用
- 文本索引解决搜索的需求
- TTL索引解决历史数据过期的需求
- Gridfs解决文件存储的需求
- aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成。
3、具体的应用场景
传统的关系型数据库在解决三高问题上的力不从心。何为三高?
- High performance - 对数据库高并发读写的需求。
- Huge Storage - 对海量数据的高效率存储和访问的需求。
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。MongoDB可以完美解决三高问题。
4、以下是几个实际的应用案例:
- 游戏场景:使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
- 物流场景:使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
- 社交场景:使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
- 物联网场景:使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
- 视频直播:使用MongoDB存储用户信息、点赞互动信息。
5、选择MongoDB的场景总结:
- 数据量大
- 读写操作频繁
- 数据价值较低,对事务要求不高
3.MongoDB的特点
1、高性能
MongoDB提供高性能的数据持久性。对嵌入式数据模型的支持减少了数据库系统上的IO活动。
索引支持更快的查询,并且包含嵌入式文档和数组的键。
- 文本索引解决搜索的需求;
- TTL索引解决历史数据自动过期的需求;
- 地理位置索引可用于构建各种 O2O 应用;
2、高可用性
MongoDB的复制工具称为副本集(reolica set),它包含提供自动故障转移和数据冗余。
3、高可用性
MongoDB提供了水平可扩展性作为其核心功能的一部分。
分片将数据分布在一组集群的机器上。(海量数据存储、服务能力水平扩展)
从3.4起,MongoDB支持基于片键创建数据区域,在一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片。
4、丰富的查询支持
MongoDB支持丰富的查询语言,支持读写(CRUD)操作、比如数据聚合、文本搜索、地理空间查询等。
5、其他特点
如动态模式、灵活的文档模型。
4.基本数据结构
与 MySQL 等关系型数据库一样,MongoDB 也有类似的概念,但是其称呼不同。下表列出了 MongoDB 的基本数据结构以及与 MySQL 的对比。
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |

1. MongoDB的体系结构
MongoDB中的集合相当于MySQL中表的概念;
MongoDB中的文档相当于MySQL中行的概念;
MongoDB中的域相当于MySQL中字段/列的概念;
2. MongoDB的特点(或使用场景)
支持存储海量数据;(例如:直播中的打赏数据);
支持频繁的数据读写;(例如:游戏道具);
数据安全性不高,存在数据误差(丢失数据);
MongoDB不支持多表操作,不支持事务;
MongoDB使用Bson存储格式,支持动态字段管理;
3. MongoDB与MySQL、Redis对比
与Redis对比
1. Redis纯内存数据库,内存不足时触发淘汰策略,MongoDB使用内存加磁盘的存储策略具有高扩展性;
2. MongoDB使用Bson存储格式,支持动态字段管理方便扩展;
与mysql对比
1. MongoDB不支持多表操作,不支持事务;
2. MongoDB使用Bson存储格式,支持动态字段管理;
查询效率对比
Redis > MongoDB > MySQL
4. MongoDB存储原理
MongoDB采用内存加磁盘的方式存储数据;
MongoDB支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;
客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;
内存中的日志每10ms向磁盘中的日志进行同步一次,数据则每分钟同步一次;
客户端先去内存中查询数据,内存中没有再去查询磁盘;
当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;
如果机器宕机,在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比,将未入到磁盘中的数据写入磁盘,但可能会丢失10ms的数据;
5.安装
1.拉取mongo镜像
docker pull mongo:4.4
2. 创建mongo数据持久化目录
mkdir -p mongodb/data
3. 运行容器
docker run -itd --name mongo -v /Users/huzhen/docker/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
2.创建用户
登录mongo容器,并进入到【admin】数据库
docker exec -it mongo mongo admin
创建一个用户,mongo 默认没有用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
【user:‘root’ 】:设置用户名为root
【pwd:‘123456’】:设置密码为123456
【role:‘userAdminAnyDatabase’】:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
【db: ‘admin’】:可操作的数据库
【‘readWriteAnyDatabase’】:赋予用户读写权限
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
连接、测试
连接mongo数据库
db.auth('root', '123456')
测试数据库,插入一条语句
db.user.insert({"name":"huzhen","cardNo":345675432})
测试数据库,查询刚才插入的语句
db.user.find()

navicat连接测试

6.SpringBoot集成MongoDB
基于MongoTemplate 开发CRUD
MongoTemplate常用方法
mongoTemplate.findAll(User.class): 查询User文档的全部数据
mongoTemplate.findById(, User.class): 查询User文档id为id的数据
mongoTemplate.find(query, User.class);: 根据query内的查询条件查询
mongoTemplate.upsert(query, update, User.class): 修改
mongoTemplate.remove(query, User.class): 删除
mongoTemplate.insert(User): 新增
Query对象
1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)
2、 精准条件:criteria.and(“key”).is(“条件”)
模糊条件:criteria.and(“key”).regex(“条件”)
3、封装条件:query.addCriteria(criteria)
4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)
小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)
5、Query.addCriteria(new Criteria().andOperator(gt,lt));
6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。
7、排序 :query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring.data.mongodb.uri= mongodb://root:123456@127.0.0.1:27017/?authSource=admin
spring.data.mongodb.database= admin




浙公网安备 33010602011771号