MongoDB分析

1.概念

  MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

  MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

  MongoDB是文档型的NoSQL数据库,数据以文档(对应关系型数据库的记录)的形式在MongoDB中保存,文档实际上就是一个个JSON字符串,使用JSON的好处是非常直观,通过一系列的Key-Value键值对来表示数据,符合我们的阅读习惯。

  在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

 

 

 

 

posted @ 2023-09-08 11:19  古月辣糖满一满  阅读(90)  评论(0)    收藏  举报