跳至主要內容

(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关系型数据库
DatabaseDatabase
CollectionTable
DocumentRecord/Row
FiledColumn
Embedded DocumentsTable join

12 MySQL和 Mongodb 的区别?

形式MongoDBMySQL
数据库模型非关系型关系型
存储方式虚拟内存+持久化
查询语句独特的MongoDB查询方式传统SQL语句
架构特点副本集以及分片常见单点、M-S、MHA、MMM等架构方式
数据处理方式基于内存,将热数据存在物理内存中,从而达到高速读写不同的引擎拥有自己的特点
使用场景事件的记录,内容管理或者博客平台等数据大且非结构化数据的场景适用于数据量少且很多结构化数据

13 Mongodb 和 Redis 区别?

形式MongoDBredis
内存管理机制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()方法。

上次编辑于: