MongoDB 面试题



尊敬的读者们,这些MongoDB 面试题是专门为了让您熟悉在MongoDB面试中可能遇到的问题类型而设计的。根据我的经验,优秀的 interviewers 很少会提前计划好面试中要问的具体问题,通常会从该主题的一些基本概念开始,然后根据后续的讨论和您的回答继续提问。

NoSQL 数据库提供了一种存储和检索数据的机制,其数据模型不同于关系数据库(如 SQL、Oracle 等)中使用的表格关系。

NoSQL 数据库类型

  • 文档型
  • 键值型
  • 图型
  • 列存型

MongoDB 是一个文档型数据库。它以基于 BSON 结构的文档形式存储数据。这些文档存储在集合中。

  • 灵活的文档型数据模型
  • 敏捷且高度可扩展的数据库
  • 比传统数据库更快
  • 表达力强的查询语言

命名空间是数据库名称和集合名称的串联。例如,school.students,其中 school 是数据库,students 是集合。

目前,MongoDB 提供了对 C、C++、C#、Java、Node.js、Perl、PHP、Python、Ruby、Scala、Go 和 Erlang 的官方驱动程序支持。MongoDB 可以轻松地与这些语言中的任何一种一起使用。还有一些其他社区支持的驱动程序,但上述驱动程序是由 MongoDB 官方提供的。

SQL 数据库将数据存储为表、行、列和记录的形式。这些数据存储在预定义的数据模型中,对于当今快速发展的现实世界应用来说,这种模型不够灵活。相比之下,MongoDB 使用灵活的结构,可以轻松修改和扩展。

MongoDB 允许高度灵活和可扩展的文档结构。例如,MongoDB 中的一个数据文档可以有五列,而同一集合中的另一个文档可以有十列。此外,由于高效的索引和存储技术,MongoDB 数据库比 SQL 数据库更快。

尽管这两个数据库都是文档型的,但对于需要动态查询和在大型数据库上具有良好性能的应用程序来说,MongoDB 是更好的选择。另一方面,CouchDB 更适合于查询变化较少且预定义查询的应用程序。

不支持。MongoDB 不支持这种关系。

不支持。MongoDB 不支持默认的多文档 ACID 事务。但是,MongoDB 提供了对单个文档的原子操作。

默认情况下,MongoDB 不支持这种主键 - 外键关系。但是,我们可以通过将一个文档嵌入到另一个文档中来实现这个概念。例如,地址文档可以嵌入到客户文档中。

不需要。MongoDB 甚至可以在少量 RAM 上运行。MongoDB 根据其他进程的需求动态分配和释放 RAM。

MongoDB 延迟将数据推送到磁盘。它会立即将更新写入日志,但将数据从日志写入磁盘的过程是延迟的。

ObjectID 是一种 12 字节的 BSON 类型,包含:

  • 4 个字节的值表示秒数
  • 3 个字节的机器标识符
  • 2 个字节的进程 ID
  • 3 个字节的计数器

正确

是的。从数据库中删除文档也会将其从磁盘中删除。

use school;
db.persons.insert( { name: "kadhir", dept: "CSE" } )

索引支持高效执行 MongoDB 中的查询。如果没有索引,MongoDB 必须执行集合扫描,即扫描集合中的每个文档,才能选择与查询语句匹配的文档。如果查询存在相应的索引,MongoDB 可以使用该索引来限制它必须检查的文档数量。

默认情况下,MongoDB 为每个集合创建 _id 索引。

可以。可以在 MongoDB 中对数组字段进行索引。在这种情况下,MongoDB 将为数组的每个值建立索引。

覆盖查询是指:

  • 查询中使用的字段是查询中使用的索引的一部分,并且
  • 结果中返回的字段也在同一个索引中

由于所有字段都包含在索引中,MongoDB 可以使用同一个索引匹配查询条件并返回结果字段,而无需查看文档内部。由于索引存储在 RAM 中或按顺序位于磁盘上,因此这种访问速度要快得多。

是的。MongoDB 支持创建文本索引以支持对字符串内容中的文本进行搜索。这是 2.6 版本中引入的一项新功能。

如果索引不适合 RAM,MongoDB 将从磁盘读取数据,这比从 RAM 读取数据慢得多。

db.collection.getIndexes()

默认配置下,MongoDB 每 60 秒将更新写入磁盘。但是,可以使用 commitIntervalMs 和 syncPeriodSecs 选项进行配置。

为了在 MongoDB 中实现事务和锁定的概念,我们可以使用文档嵌套,也称为嵌入式文档。MongoDB 支持单个文档内的原子操作。

聚合操作处理数据记录并返回计算结果。聚合操作将多个文档中的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。MongoDB 提供三种执行聚合的方法:聚合管道、map-reduce 函数以及单用途聚合方法和命令。

分片是一种将数据存储在多台机器上的方法。MongoDB 使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

复制是将数据同步到多台服务器的过程。复制提供冗余并提高数据可用性。通过在不同的数据库服务器上拥有多个数据副本,复制可以保护数据库免受单个服务器丢失的影响。复制还可以帮助您从硬件故障和服务中断中恢复。

主节点(或主服务器)是可以接受写入操作的节点。MongoDB 的复制是“单主”的:一次只有一个节点可以接受写入操作。

次节点(或从服务器)是只读节点,它们从主节点复制数据。

错误。MongoDB 仅将数据写入主副本集。

MongoDB 预先分配数据文件以预留空间并在设置服务器时避免文件系统碎片。

对于以下情况,应考虑嵌入文档:

  • 实体之间的“包含”关系
  • 一对多关系
  • 性能原因

在运行 32 位版本的 MongoDB 时,服务器的总存储大小(包括数据和索引)为 2 GB。因此,不要在 32 位机器上将 MongoDB 部署到生产环境。

如果您运行的是 64 位版本的 MongoDB,则存储大小几乎没有限制。

存储引擎是数据库中负责管理数据如何存储在磁盘上的部分。例如,一个存储引擎可能为读密集型工作负载提供更好的性能,而另一个存储引擎可能支持更高的写入吞吐量。

MongoDB 使用 MMAPv1 和 WiredTiger。

数据库分析器收集有关 MongoDB 写入操作、游标、正在运行的 mongod 实例上的数据库命令的细粒度数据。您可以针对每个数据库或每个实例启用分析。

数据库分析器将其收集的所有数据写入 system.profile 集合,这是一个固定大小的集合。

在启用日志记录的情况下,MongoDB 会在将更改写入磁盘上的数据文件之前,先将写入操作存储在内存中并在磁盘日志中应用。对日志的写入是原子的,确保磁盘日志文件的完整性。启用日志记录后,MongoDB 会在 dbPath 定义的目录(默认为 /data/db)中创建一个日志子目录。

db.isMaster()

不能。MMAPv1 不允许配置缓存大小。

对于 WiredTiger 存储引擎,您可以指定 WiredTiger 将用于所有数据的缓存的最大大小。这可以通过 `storage.wiredTiger.engineConfig.cacheSizeGB` 选项来完成。

MongoDB 使用读写锁,允许并发读取器共享访问资源(例如数据库或集合),但只允许单个写操作独占访问。

您可以对游标使用 `snapshot()` 方法来隔离特定情况下的操作。`snapshot()` 遍历 `_id` 字段上的索引,并保证查询最多只返回每个文档一次。

是的。`copyDatabase()`、`repairDatabase()` 等操作可以锁定多个相关的数据库。

在复制过程中,当 MongoDB 向主节点上的集合写入数据时,MongoDB 也会向主节点的 oplog 写入数据,oplog 是本地数据库中的一个特殊集合。因此,MongoDB 必须同时锁定集合的数据库和本地数据库。

GridFS 是一个用于存储和检索超过 BSON 文档大小限制(16MB)的文件的规范。它不是将文件存储在单个文档中,而是将文件分成多个部分(或块),并将每个块作为单独的文档存储。

是的。在 2.4 版本中添加的 V8 JavaScript 引擎允许同时运行多个 JavaScript 操作。

`explain()` 命令可用于获取此信息。可能的模式包括:'queryPlanner'、'executionStats' 和 'allPlansExecution'。

下一步是什么?

接下来,您可以回顾一下您之前完成的与该主题相关的作业,并确保您能够自信地谈论它们。如果您是应届毕业生,面试官并不期望您能回答非常复杂的问题,而是希望您的基础概念非常扎实。

其次,如果您无法回答一些问题,这并不重要,重要的是,无论您回答了什么问题,都必须充满自信地回答。所以在面试中要保持自信。Tutorialspoint 祝您面试顺利,并祝您未来的事业一切顺利!干杯 :-)

mongodb_questions_answers.htm
广告