求职面试必备:MongoDB常见面试题和答案合集

2021年12月12日21:46:29 发表评论 1,193 次浏览

MongoDB 简介

在处理数据时,我们知道有两种类型的数据——(i)结构化数据和(ii)非结构化数据。结构化数据通常以表格形式存储,而非结构化数据则不然。为了管理大量非结构化数据(如日志或物联网数据),使用了 NoSQL 数据库。

现在,什么是 MongoDB?

  • MongoDB 是一个用 C++ 语言编写的开源 NoSQL 数据库。它使用带有可选模式的类似 JSON 的文档。 
  • 它提供了简单的可扩展性,是一个跨平台、面向文档的数据库。
  • MongoDB 基于集合和文档的概念。
  • 它结合了横向扩展的能力和二级索引、范围查询、排序、聚合和地理空间索引等功能。
  • MongoDB 由 MongoDB Inc. 开发并根据服务器端公共许可证 (SSPL) 获得许可。

基本MongoDB常见面试题和答案合集

1. MongoDB 有哪些优点?

MongoDB面试题解析:MongoDB 的一些优点如下:

  • MongoDB 支持字段、基于范围、字符串模式匹配类型的查询。用于搜索数据库中的数据 
  • MongoDB 支持任何字段的一级和二级索引
  • MongoDB 基本上使用 JavaScript 对象代替过程
  • MongoDB 使用动态数据库模式
  • MongoDB 非常容易扩展或缩减
  • MongoDB 内置了对数据分区(分片)的支持。

2. MongoDB常见面试题有哪些:MongoDB 中的文档是什么?

MongoDB 中的文档是具有关联值的有序键集。它由映射、散列或字典表示。在 JavaScript 中,文档被表示为对象:
{"greeting" : "Hello world!"}

复杂的文档将包含多个键/值对:
{"greeting" : "Hello world!", "views" : 3}

3. 什么是 MongoDB 中的集合?

MongoDB 中的集合是一组文档。如果文档是关系数据库中一行的 MongoDB 类比,那么集合可以被认为是表的类比。
单个集合中的文档可以具有任意数量的不同“形状”,即集合具有动态模式。 
例如,以下两个文档都可以存储在一个集合中:

{"greeting" : "Hello world!", "views": 3}
{"signoff": "Good bye"}

4. 什么是 MongoDB 中的数据库?

MongoDB 将集合分组到数据库中。MongoDB 可以托管多个数据库,每个数据库将集合组合在一起。 
一些保留的数据库名称如下:
admin
local
config

5. 什么是 Mongo Shell?

它是一个 JavaScript shell,允许从命令行与 MongoDB 实例进行交互。有了它,你就可以执行管理功能、检查实例或探索 MongoDB。 

要启动 shell,请运行 mongo 可执行文件:

$ mongod
$ mongo
MongoDB shell version: 4.2.0
connecting to: test
>

shell 是一个功能齐全的 JavaScript 解释器,能够运行任意 JavaScript 程序。让我们看看基础数学是如何工作的:

> x = 100;
200
> x / 5;
20

6. MongoDB中Scale-Out是如何发生的?

MongoDB 面向文档的数据模型可以更轻松地将数据拆分到多个服务器上。跨集群平衡和加载数据由 MongoDB 完成。然后它会自动重新分发文档。

mongos 充当查询路由器,提供客户端应用程序和分片集群之间的接口。

配置服务器存储集群的元数据和配置设置。MongoDB 使用配置服务器来管理分布式锁。每个分片集群必须有自己的配置服务器。 

求职面试必备:MongoDB常见面试题和答案合集

7. MongoDB 有哪些特点?

  • 索引:它支持通用二级索引并提供独特的、复合的、地理空间的和全文索引功能。
  • 聚合:它提供了一个基于数据处理管道概念的聚合框架。
  • 特殊集合和索引类型:它支持应在特定时间到期的数据的生存时间 (TTL) 集合
  • 文件存储:支持易于使用的协议,用于存储大文件和文件元数据。
  • 分片:分片是跨机器拆分数据的过程。

8、如何在M​​ongoDB中添加数据?

向 MongoDB 添加数据的基本方法是“插入”。要插入单个文档,请使用集合的insertOne方法:

> db.books.insertOne({"title" : "Start With Why"})

为了将多个文档插入到一个集合中,我们使用insertMany. 此方法允许将文档数组传递到数据库。

9. 如何更新文档?

一旦文档存储在数据库中,就可以使用以下几种更新方法之一进行更改:updateOneupdateManyreplaceOne. updateOneupdateMany每个都将过滤器文档作为它们的第一个参数,将描述要进行的更改的修饰符文档作为第二个参数。replaceOne也将过滤器作为第一个参数,但作为第二个参数replaceOne需要一个文档,它将替换与过滤器匹配的文档。

例如,为了替换文档:

{
   "_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
   "name" : "alice",
   "friends" : 24,
   "enemies" : 2
}

10. 如何删除文档?

MongoDB面试题解析:MongoDB 中的 CRUD API 提供deleteOnedeleteMany为此目的。这两种方法都将过滤器文档作为它们的第一个参数。过滤器指定一组标准以匹配删除文档。

例如:
> db.books.deleteOne({"_id" : 3})

11.如何在MongoDB中执行查询?

find方法用于在 MongoDB 中执行查询。查询返回集合中文档的子集,从根本没有文档到整个集合。返回哪些文档由 的第一个参数决定,该参数find是指定查询条件的文档。

例子:
> db.users.find({"age" : 24})

12. MongoDB常见面试题有哪些:MongoDB 中有哪些数据类型?

MongoDB 支持多种数据类型作为文档中的值。MongoDB 中的文档类似于 JavaScript 中的对象。除了 JSON 的基本键/值对性质外,MongoDB 还增加了对许多其他数据类型的支持。MongoDB中常见的数据类型有:

  • Null
    {"x" : null}
  • Boolean
    {"x" : true}
  • Number
    {"x" : 4}
  • String
    {"x" : "foobar"}
  • Date
    {"x" : new Date()}
  • Regular expression
    {"x" : /foobar/i}
  • Array
    {"x" : ["a", "b", "c"]}
  • Embedded document
    {"x" : {"foo" : "bar"}}
  • Object ID
    {"x" : ObjectId()}
  • 二进制数据:二进制数据是一串任意字节。
  • Code
    {"x" : function() { /* ... */ }}

13. 什么时候使用MongoDB?

当你构建需要快速发展和优雅扩展的互联网和业务应用程序时,你应该使用 MongoDB。MongoDB 深受使用敏捷方法构建可扩展应用程序的各类开发人员的欢迎。
如果需要,MongoDB 是一个不错的选择:

  • 支持快速迭代开发。
  • 扩展到高水平的读写流量 - MongoDB 支持通过分片进行水平扩展,将数据分布在多台机器上,并促进大数据集的高吞吐量操作。
  • 将你的数据存储库扩展到一个巨大的规模。
  • 随着业务的变化发展部署类型。
  • 使用文本、地理空间或时间序列维度存储、管理和搜索数据。

中级MongoDB常见面试题和答案合集

14. MongoDB中的Querying是怎么做的?

find方法用于在 MongoDB 中执行查询。查询返回集合中文档的子集,从根本没有文档到整个集合。返回哪些文档由 find 的第一个参数决定,这是一个指定查询条件的文档。

例如:如果我们有一个想要匹配的字符串,例如一个值为“alice”的“username”键,我们将使用该键/值对:

> db.users.find({"username" : "alice"})

15. 解释 MongoDB 中的“索引”一词。

在 MongoDB 中,索引有助于有效地解析查询。索引的作用是以易于遍历的形式存储一小部分数据集。索引存储特定字段或字段集的值,按索引中指定的字段值排序。 
MongoDB 的索引与典型的关系数据库索引的工作方式几乎相同。

索引查看包含内容引用的有序列表。这些反过来又允许 MongoDB 查询数量级更快。要创建索引,请使用createIndex集合方法。

例如:

> db.users.find({"username": "user101"}).explain("executionStats")

在这里,executionStatsmode 帮助我们理解使用索引来满足查询的效果。

16. 什么是 MongoDB 中的地理空间索引?

MongoDB 有两种类型的地理空间索引:2dsphere 和 2d。2dsphere 索引适用于基于 WGS84 基准对地球表面进行建模的球形几何图形。该基准将地球表面建模为扁球体,这意味着两极有一些变平。因此,使用 2sphere 指数的距离计算会考虑地球的形状,并提供比 2d 指数更准确的距离处理,例如两个城市之间的距离。对二维平面上存储的点使用二维索引。

2dsphere 允许你以 GeoJSON 格式为点、线和多边形指定几何形状。一个点由一个二元数组给出,表示 [longitude, latitude]:

{
   "name" : "New York City",
   "loc" : {
       "type" : "Point",
       "coordinates" : [50, 2]
   }
}

一条线由一组点给出:

{
   "name" : "Hudson River",
   "loc" : {
       "type" : "LineString",
       "coordinates" : [[0,1], [0,2], [1,2]]
   }
}

17.解释Sharding的过程。

MongoDB面试题解析:分片是跨机器拆分数据的过程。我们有时也使用术语“分区”来描述这个概念。通过将数据的子集放在每台机器上,我们可以存储更多数据并处理更多负载,而无需更大或更强大的机器。
在下图中,RS0 和 RS1 是分片。MongoDB 的分片允许你创建一个由许多机器(分片)组成的集群,并在它们之间分解一个集合,将一个数据子集放在每个分片上。这允许你的应用程序增长超出独立服务器或副本集的资源限制。

18. 解释一下MongoDB中的SET修饰符?

如果字段的值尚不存在,则“$set”设置该值。这对于更新架构或添加用户定义的键非常有用。

例子:

> db.users.findOne()
{
   "_id" : ObjectId("4b253b067525f35f94b60a31"),
   "name" : "alice",
   "age" : 23,
   "sex" : "female",
   "location" : "India"
}

要为此添加一个字段,我们使用“$set”:

> db.users.updateOne({"_id" : 
ObjectId("4b253b067525f35f94b60a31")},
... {"$set" : {"favorite book" : "Start with Why"}}) 

高级MongoDB常见面试题和答案合集

19. 交易是什么意思?

事务是数据库中的一个逻辑处理单元,包括一个或多个数据库操作,可以是读或写操作。事务在 MongoDB 中提供了一个有用的特性来确保一致性。

MongoDB 提供了两个 API 来使用事务。 

  • 核心 API:它与关系数据库的语法相似(例如,start_transaction 和 commit_transaction)
  • 回调 API:这是使用事务的推荐方法。它启动一个事务,执行指定的操作,并提交(或中止错误)。它还自动合并了“TransientTransactionError”和“UnknownTransactionCommitResult”的错误处理逻辑。

20. 什么是 MongoDB 图表?

MongoDB Charts 是 MongoDB 中用于数据可视化的新集成工具。

MongoDB Charts 提供了使用来自 MongoDB 数据库的数据创建可视化的最佳方式。
它允许用户从数据库执行快速数据表示,而无需使用 Java 或 Python 等编程语言编写代码。

MongoDB Charts 的两种不同实现是:

  • MongoDB Charts PaaS(平台即服务)
  • MongoDB 图表服务器

21. MongoDB常见面试题有哪些:MongoDB 中的聚合框架是什么?

  • 聚合框架是 MongoDB 中的一组分析工具,允许你对一个或多个集合中的文档进行分析。
  • 聚合框架基于管道的概念。使用聚合管道,我们从 MongoDB 集合中获取输入,并将该集合中的文档通过一个或多个阶段传递,每个阶段对其输入执行不同的操作(见下图)。每个阶段都将其作为输出产生之前的任何阶段作为输入。所有阶段的输入和输出都是文档——一个文档流。

22.讲解MongoDB聚合框架中管道的概念。

聚合管道的单个阶段是数据处理单元。它一次接收一个输入文档流,一次一个处理每个文档,并一次生成一个输出文档流(见下图)。

23. 什么是 MongoDB 中的副本集?

为了在多台服务器上保留相同的数据副本,我们使用复制。建议用于所有生产部署。即使一台或多台服务器发生问题,也可以使用复制来保持应用程序运行和数据安全。

这种复制可以由 MongoDB 的副本集创建。副本集是一组服务器,其中一个主服务器负责写入,而多个辅助服务器则保留主服务器数据的副本。如果主要崩溃,次要可以从他们自己中选出一个新的主要。

24. 解释 MongoDB 中的复制架构。

下图描绘了一个只有三个服务器节点的简单副本集集群的架构图——一个主节点和两个从节点:

  • 在前面的模型中,PRIMARY 数据库是唯一一个从数据库客户端接收写操作的活动副本集成员。PRIMARY 数据库将数据更改保存在 Oplog 中。保存在 Oplog 中的更改是顺序的——也就是说,按照它们被接收和执行的顺序保存。 
  • SECONDARY 数据库正在查询 PRIMARY 数据库以获取 Oplog 中的新更改。如果有任何更改,则一旦在 PRIMARY 节点上创建 Oplog 条目,它们就会从 PRIMARY 复制到 SECONDARY。
  • 然后,SECONDARY 数据库将 Oplog 中的更改应用于其自己的数据文件。Oplog 条目的应用顺序与它们插入日志中的顺序相同。因此,SECONDARY 上的数据文件与 PRIMARY 上的更改保持同步。 
  • 通常,SECONDARY 数据库直接从 PRIMARY 复制数据更改。有时,一个 SECONDARY 数据库可以从另一个 SECONDARY 复制数据。这种类型的复制称为链式复制,因为它是一个两步复制过程。链式复制在某些复制拓扑中很有用,它在 MongoDB 中默认启用。

25. MongoDB 中有哪些用于备份和恢复的实用程序?

MongoDB面试题解析:mongo shell 不包括导出、导入、备份或恢复的功能。但是,MongoDB 已经创建了用于完成此操作的方法,因此不需要编写脚本或复杂的 GUI。为此,提供了几个实用程序脚本,可用于将数据批量输入或输出数据库。这些实用程序脚本是:

  • mongoimport
  • mongoexport
  • mongodump
  • mongorestore

MongoDB常见面试题和答案合集结论

26. 结论

MongoDB 是一个功能强大、灵活且可扩展的通用数据库。它结合了横向扩展的能力和二级索引、范围查询、排序、聚合和地理空间索引等功能。
因此,总而言之,MongoDB 是:

  • 支持索引
  • 为扩展而设计
  • 功能丰富
  • 高性能
  • 负载均衡
  • 支持分片

尽管 MongoDB 功能强大,结合了关系系统的许多功能,但它并不打算完成关系数据库所做的一切。对于某些功能,数据库服务器将处理和逻辑卸载到客户端(由驱动程序或用户的应用程序代码处理)。它对这种流线型设计的维护是 MongoDB 能够实现如此高性能的原因之一。

以下是一些深入了解MongoDB的参考资料:
https://www.mongodb.com/2
https://docs.mongodb.com

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: