(5)MongoDB
1 MongoDB是什么?
MongoDB 是基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点可以保证服务器性能。MongoDB 提供可扩展的高性能 数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似 JSON 对象,字段值可以包含其他文档,数组及文档数组。
2 MongoDB有哪些特点?
- 面向集合(
Collection
)和文档(document
)的存储,以JSON格式的文档保存数据。 - 高性能,支持
Document
中嵌入Document
减少了数据库系统上的I/O操作以及具有完整的索引支持,支持快速查询 - 高效的传统存储方式:支持二进制数据及大型对象
- 高可用性,数据复制集,MongoDB 数据库支持服务器之间的数据复制来提供自动故障转移(
automatic failover
) - 高可扩展性,分片(
sharding
)将数据分布在多个数据中心,MongoDB支持基于分片键创建数据区域 - 丰富的查询功能,,聚合管道(
Aggregation Pipeline
)、全文搜索(Text Search
)以及地理空间查询(Geospatial Queries
) - 支持多个存储引擎,比如WiredTiger存储引、In-Memory存储引擎。
- 支持在服务端执行脚本,采用 Javascript 编写函数直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
**3 在哪些场景使用MongoDB? **
如果业务中存在大量复杂的事务逻辑操作,则不要用MongoDB
数据库。在处理非结构化 / 半结构化的大数据使用MongoDB
,操作的数据类型为动态时也使用MongoDB
- 内容管理系统:切面数据、日志记录
- 游戏场景:存储游戏用户信息,用户的装备、积分等以内嵌文档的形式存储,方便查询、更新。
- 物流场景:存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
- 社交场景:存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
4 MongoDB支持哪些数据类型?
Java类似数据类型:
类型 | 解析 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位 |
Double | 双精度浮点值。用于存储浮点值 |
Boolean | 布尔值。用于存储布尔值(真/假) |
Arrays | 用于将数组或列表或多个值存储为一个键 |
Datetime | 记录文档修改或添加的具体时间 |
MongoDB特有数据类型:
类型 | 解析 |
---|---|
ObjectId | 用于存储文档 id ,ObjectId 是基于分布式主键的实现MongoDB 分片也可继续使用 |
Min/Max Keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比 |
Code | 用于在文档中存储 JavaScript 代码 |
Regular Expression | 用于在文档中存储正则表达式 |
Binary Data | 二进制数据。用于存储二进制数据 |
Null | 用于创建空值 |
Object | 用于内嵌文档 |
5 MongoDB中如何实现事务?
在MongoDB 4.0及以后版本中,MongoDB提供了多文档事务的支持。事务是对多个操作进行的原子性操作,要么全部执行成功,要么全部失败回滚。事务可以在一个或多个文档上执行读和写操作。为了使用事务,需要满足以下条件:
- MongoDB服务器的版本必须为4.0或更高版本。
- 数据库必须是副本集或分片集群。
- 启用副本集中的每个成员的写入确认。
在MongoDB中,事务可以通过startSession()方法创建一个Session对象,然后在Session对象中执行事务。使用Session对象可以跨多个操作执行事务,从而保证事务的原子性。
6 MongoDB中如何实现分片(Sharding)?
MongoDB可以通过水平分片来扩展数据库的容量和吞吐量。分片是将数据库中的数据分布在多个机器上的过程,每个机器都存储数据的一个子集。分片通常在面临大量数据或高并发请求的情况下使用。MongoDB的分片方案包含以下几个步骤:
1)创建分片集群:分片集群包含多个分片节点和一个或多个mongos路由器节点。mongos节点是客户端与分片集群交互的入口点。
2)为数据库选择分片键:选择适当的分片键可以确保数据能够均匀地分布在各个分片节点上。
3)启动mongos路由器节点:启动mongos路由器节点,并将它们连接到分片集群。
4)启动分片节点:启动一组分片节点,并将它们连接到分片集群。
5)创建分片集合:创建一个要分片的集合,并指定分片键。
6)启用分片:启用分片后,MongoDB会自动将数据均匀地分布在各个分片节点上。
7 如何使用MongoDB中的Map-Reduce?
MongoDB的Map-Reduce是一种分布式计算框架,用于对大规模数据进行批量处理。它可以将Map操作和Reduce操作分别应用于输入数据的不同部分,并将处理结果汇总为最终结果。Map-Reduce通常用于处理离线数据,例如生成报表、统计指标、计算复杂的数据关系等。MongoDB支持基于JavaScript的Map-Reduce,也支持基于聚合管道的Map-Reduce。
8 MongoDB如何备份和还原数据?
MongoDB可以通过mongodump和mongorestore工具进行备份和还原。mongodump工具可以将MongoDB数据库备份到文件系统中,mongorestore工具可以将备份的数据还原到MongoDB中。使用mongodump备份数据的基本语法如下: shell mongodump –host –port –out
;使用mongorestore还原数据的基本语法如下: shell mongorestore –host –port
9 MongoDB的聚合管道(Aggregation Pipeline)是什么?
MongoDB的聚合管道是一种对文档进行聚合计算的框架,类似于SQL中的GROUP BY和聚合函数。聚合管道由一系列操作符组成,可以对输入的文档进行筛选、排序、分组、投影、聚合等操作,并输出计算结果。常用的操作符包括 shell $match、$sort、$group、$project、$limit、$skip、$unwind、$lookup
等。
10 说说MongoDB常见的增删改查操作?
- Create:db.collection.insert();
- Read:db.collection.find();
- Update:db.collection.Update();
- Delete:db.collection.deleteOne({price:60});
11 什么是 Collection、 Document,以及与关系型数据库术语类比?
- 集合
Collection
位于单独的一个数据库MongoDB 文档Document
集合,它类似关系型数据库(RDBMS)中的表Table
。一个集合Collection
内的多个文档Document
可以有多个不同的字段。通常情况下,集合Collection
中的文档Document
有着相同含义。 - 文档
Document
由key-value构成。文档Document
是动态模式,这说明同一集合里的文档不需要有相同的字段和结构。类似于关系型数据库中table中的每一条记录。 - 与关系型数据库术语类比
mongodb | 关系型数据库 |
---|---|
Database | Database |
Collection | Table |
Document | Record/Row |
Filed | Column |
Embedded Documents | Table join |
12 MySQL和 Mongodb 的区别?
形式 | MongoDB | MySQL |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | 虚拟内存+持久化 | |
查询语句 | 独特的MongoDB查询方式 | 传统SQL语句 |
架构特点 | 副本集以及分片 | 常见单点、M-S、MHA、MMM等架构方式 |
数据处理方式 | 基于内存,将热数据存在物理内存中,从而达到高速读写 | 不同的引擎拥有自己的特点 |
使用场景 | 事件的记录,内容管理或者博客平台等数据大且非结构化数据的场景 | 适用于数据量少且很多结构化数据 |
13 Mongodb 和 Redis 区别?
形式 | MongoDB | redis |
---|---|---|
内存管理机制 | MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘 | Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据 |
支持的数据结构 | MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引 | Redis 支持的数据结构丰富,包括hash、set、list等 |
性能 | mongodb依赖内存,TPS较高 | Redis依赖内存,TPS非常高。性能上Redis优于MongoDB |
可靠性 | 支持持久化以及复制集增加可靠性 | Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能 |
数据分析 | mongodb内置数据分析功能(mapreduce) | Redis不支持 |
事务支持情况 | 只支持单文档事务,需要复杂事务支持的场景暂时不适合 | Redis 事务支持比较弱,只能保证事务中的每个操作连续执行 |
集群 | MongoDB 集群技术比较成熟 | Redis从3.0开始支持集群 |
14 MongoDB索引类型有哪些?
- 单字段索引(
Single Field Indexes
) - 复合索引(
Compound Indexes
) - 多键索引(
Multikey Indexes
) - 全文索引(
text Indexes
) - Hash 索引(
Hash Indexes
) - 通配符索引(
Wildcard Index
) - 2dsphere索引(
2dsphere Indexes
)
15 MongoDB 在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
MongoDB 索引使用 B-tree 树原理,只会在 A:{B,C} 上使用索引
16 MongoDB中什么是聚合?
聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。相当于 SQL
中的 count(*)
组合 group by
。对于 MongoDB
中的聚合操作,应该使用aggregate()
方法。