30+ 个热门 MongoDB 面试问题及答案

2025-05-25

30+ 个热门 MongoDB 面试问题及答案

30+ 热门 MongoDB 面试问题及答案(2018 年更新)
NoSQL 数据库运动的兴起是为了解决关系数据库的缺陷并满足现代软件开发的需求。MongoDB 是领先的 NoSQL 数据库,在《财富》500 强和全球 500 强企业中得到广泛采用。

最初发表于FullStack.Cafe - 让你的技术面试不再失败

Q1:解释一下什么是MongoDB?

主题:MongoDB
难度:⭐

MongoDB 是一个开源文档数据库,提供高性能、高可用性和自动扩展功能。
其主要功能如下:

  • 面向文档和 NoSQL 数据库。
  • 支持聚合
  • 使用 BSON 格式
  • 分片(有助于水平扩展)
  • 支持即席查询
  • 无模式
  • 上限集合
  • 索引(MongoDB 中的任何字段都可以被索引)
  • MongoDB 副本集(提供高可用性)
  • 支持多种存储引擎

🔗来源: mongodb.com

Q2:MongoDB中数据是如何存储的?

主题:MongoDB
难度:⭐⭐

MongoDB 中的数据存储在 BSON 文档(JSON 风格的数据结构)中。文档包含一个或多个字段,每个字段包含特定数据类型的值,包括数组、二进制数据和子文档。结构相似的文档会被组织为集合。您可以将文档类比为关系数据库中的行,将字段类比为列,将集合类比为表。

使用文档的优点是:

  • 文档(即对象)对应于许多编程语言中的本机数据类型。
  • 嵌入式文档和数组减少了昂贵连接的需要。
  • 动态模式支持流畅的多态性。

🔗来源: mongodb.com

Q3:MongoDB 中的索引是什么?

主题:MongoDB
难度:⭐⭐

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

🔗资料来源: tutorialspoint.com

问题4:MongoDB中可以在数组字段上创建索引吗?如果可以,那么会发生什么?

主题:MongoDB
难度:⭐⭐

是的。MongoDB 中可以对数组字段进行索引。在这种情况下,MongoDB 会为数组中的每个值建立索引,以便您可以查询单个项目:

> db.col1.save({'colors': ['red','blue']})
> db.col1.ensureIndex({'colors':1})

> db.col1.find({'colors': 'red'})
{ "_id" : ObjectId("4ccc78f97cf9bdc2a2e54ee9"), "colors" : [ "red", "blue" ] }
> db.col1.find({'colors': 'blue'})
{ "_id" : ObjectId("4ccc78f97cf9bdc2a2e54ee9"), "colors" : [ "red", "blue" ] }
Enter fullscreen mode Exit fullscreen mode

🔗来源: stackoverflow.com

问题5:MongoDB 中的复制是什么?

主题:MongoDB
难度:⭐⭐

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

🔗资料来源: interviewbubble.com

Q6:MongoDB 中的聚合是什么?

主题:MongoDB
难度:⭐⭐⭐

聚合操作处理数据记录并返回计算结果。聚合操作将来自多个文档的值分组在一起,并可以对分组数据执行各种操作以返回单个结果。MongoDB 提供了三种执行聚合的方式:

  • 聚合管道,
  • map-reduce 函数,
  • 以及单一用途的聚合方法和命令。

🔗资料来源: tutorialspoint.com

Q7:如何使用 %like% 查询 MongoDB?

主题:MongoDB
难度:⭐⭐⭐

我想查询一些类似 SQL 的查询:

select * 
from users 
where name like '%m%'
Enter fullscreen mode Exit fullscreen mode

如何在 MongoDB 中执行相同操作?


db.users.find({name: /a/})  //like '%a%'
db.users.find({name: /^pa/}) //like 'pa%'
db.users.find({name: /ro$/}) //like '%ro'
Enter fullscreen mode Exit fullscreen mode

或者使用 Mongoose:

db.users.find({'name': {'$regex': 'sometext'}})
Enter fullscreen mode Exit fullscreen mode

🔗来源: stackoverflow.com

Q8:如何在 MongoDB 中执行等效的 SQL JOIN?

主题:MongoDB
难度:⭐⭐⭐

MongoDB 并非关系型数据库,开发人员也谨慎推荐 $lookup 的具体用例,但至少从 MongoDB 3.2 开始,现在可以进行连接操作了。添加到聚合管道的新 $lookup 运算符本质上与左外连接相同:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}
Enter fullscreen mode Exit fullscreen mode

🔗来源: stackoverflow.com

Q9:MongoDB 和 CouchDB 有什么区别?

主题:MongoDB
难度:⭐⭐⭐

MongoDB 和 CouchDB 都是开源 NoSQL 数据库的典范。它们都是面向文档的数据库。虽然两者都存储数据,但它们在数据模型、接口、对象存储和复制方法等方面的实现存在很大差异。

🔗来源: medium.com/@hub4tech

问题 10:什么是 NoSQL 数据库?NoSQL 数据库有哪些不同类型?

主题:MongoDB
难度:⭐⭐⭐

NoSQL 数据库提供了一种数据存储和检索机制,该机制采用关系数据库(如 SQL、Oracle 等)中使用的表格关系以外的方式建模。

NoSQL 数据库的类型:

  • 面向文档
  • 键值
  • 图形
  • 面向列

🔗资料来源: interviewbubble.com

Q11:解释MongoDB中ObjectID的结构

主题:MongoDB
难度:⭐⭐⭐

ObjectId较小,很可能是唯一的,生成速度快,并且有序。ObjectId 值由 12 个字节组成,其中前四个字节是反映 ObjectId 创建时间的时间戳。具体来说:

  • 一个 4 字节值,表示自 Unix 纪元以来的秒数,
  • 一个 5 字节的随机值,以及
  • 一个 3 字节的计数器,以随机值开头。在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了 _id 字段,MongoDB 驱动程序会自动为该 _id 字段生成一个 ObjectId。

🔗来源: mongodb.com

Q12:MongoDB 中的覆盖查询是什么?

主题:MongoDB
难度:⭐⭐⭐

覆盖查询是指:

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

🔗资料来源: tutorialspoint.com

Q13:查找两个日期之间的对象 MongoDB

主题:MongoDB
难度:⭐⭐⭐

db.CollectionName.find({"whenCreated": {
    '$gte': ISODate("2018-03-06T13:10:40.294Z"),
    '$lt': ISODate("2018-05-06T13:10:40.294Z")
}});
Enter fullscreen mode Exit fullscreen mode

🔗来源: stackoverflow.com

Q14:什么是oplog?

主题:MongoDB
难度:⭐⭐⭐

oplog (操作日志)是一个特殊的固定集合,它滚动记录所有修改数据库中数据的操作。MongoDB 在主节点上执行数据库操作,然后将这些操作记录在主节点的 oplog 中。然后,辅助节点会以异步方式复制并应用这些操作

🔗资料来源: tutorialspoint.com

Q15:MongoDB 是否支持 ACID 事务管理和锁定功能?

主题:MongoDB
难度:⭐⭐⭐

ACID 认为任何更新都是:

  • 原子性:要么完全完成,要么不完成
  • 一致性:没有读者会看到“部分应用”的更新
  • 隔离:没有读者会看到“脏”读
  • 耐用:(具有适当的写入关注)

MongoDB 过去不支持默认的多文档 ACID 事务(可回滚且符合 ACID 标准的多文档更新)。然而,MongoDB 提供了对单个文档的原子操作。MongoDB 4.0将添加对多文档事务的支持,使其成为唯一一个将文档模型的速度、灵活性和强大功能与 ACID 数据完整性保证相结合的数据库。

🔗资料来源: tutorialspoint.com

Q16:MongoDB 中的分片是什么?解释一下。

主题:MongoDB
难度:⭐⭐⭐

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

🔗资料来源: tutorialspoint.com

问题 17:在将数据存储到 MongoDB 之前,我应该对其进行规范化吗?

主题:MongoDB
难度:⭐⭐⭐

这取决于你的目标。规范化将提供更新高效的数据表示。非规范化将提高数据读取的效率

一般来说,在以下情况下使用嵌入式数据模型(非规范化):

  • 实体之间存在“包含”关系。
  • 实体之间存在一对多关系。在这些关系中,“多个”文档(或子文档)始终与“一个”文档(或父文档)一起出现,或在“一个”文档(或父文档)的上下文中查看。

一般来说,使用规范化的数据模型:

  • 嵌入会导致数据重复,但不会提供足够的读取性能优势来抵消重复的影响。
  • 来表示更复杂的多对多关系。
  • 对大型分层数据集进行建模。

此外,像在关系数据库中那样对数据进行规范化在 MongoDB 中通常不是一个好主意。关系数据库中的规范化只有在表间 JOIN 操作相对廉价的前提下才可行。$lookup 聚合运算符提供了一些有限的 JOIN 功能,但它不适用于分片集合。因此,应用程序通常需要通过多个后续数据库查询来模拟连接操作,这非常缓慢(有关更多信息,请参阅问题“MongoDB 和 JOIN”)。

🔗来源: stackoverflow.com

Q18:MongoDB如何保证高可用性?

主题:MongoDB
难度:⭐⭐⭐⭐

MongoDB 自动维护副本集,即分布在服务器、机架和数据中心的多个数据副本。副本集通过原生复制和自动故障转移功能,帮助防止数据库宕机。

副本集由多个副本集成员组成。在任何给定时刻,一个成员充当主成员,其他成员充当次成员。如果主成员因任何原因(例如硬件故障)发生故障,则其中一个次成员将自动当选为主成员,并开始处理所有读写操作。

🔗来源: mongodb.com

Q19:MongoDB如何提供并发性?

主题:MongoDB
难度:⭐⭐⭐⭐

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

🔗资料来源: tutorialspoint.com

Q20:MongoDB 中的日志功能如何工作?

主题:MongoDB
难度:⭐⭐⭐⭐

启用日志功能运行时,MongoDB 会在更改写入磁盘数据文件之前,将写入操作存储并应用于内存和磁盘日志中。日志写入具有原子性,从而确保了磁盘日志文件的一致性。启用日志功能后,MongoDB 会在 dbPath 定义的目录中创建一个日志子目录,默认为 /data/db。

🔗资料来源: tutorialspoint.com

Q21:何时使用 Redis 或 MongoDB?

主题:MongoDB
难度:⭐⭐⭐⭐

  • 如果您还不确定如何查询数据或使用哪种模式,请使用 MongoDB。MongoDB
    适用于黑客马拉松、初创公司,或者您不知道如何查询插入的数据的情况。MongoDB 不会对您的底层模式做出任何假设。虽然 MongoDB 是无模式和非关系型的,但这并不意味着它完全没有模式。这仅仅意味着您需要在应用程序中定义模式(例如使用 Mongoose)。除此之外,MongoDB 非常适合原型设计或尝试新事物。但它的性能并不是很好,无法与 Redis 相比。

  • 使用 Redis 来加速您现有的应用程序。将 Redis 用作独立数据库系统的情况并不常见(有些人更喜欢将其称为“键值”存储)。

🔗来源: stackoverflow.com

问题22:MongoDB 关系。应该使用什么——嵌入还是引用?

主题:MongoDB
难度:⭐⭐⭐⭐

我想设计一个包含一些评论的问题结构,但我不知道评论应该使用哪种关系:嵌入还是引用?请解释一下这两种方案的优缺点。


一般来说,

  • 如果实体之间存在一对一或一对多关系,则embed是很好的选择,并且
  • 如果存在多对多关系,则引用很有用。

另外,请考虑一条一般规则:如果您有很多[子文档],或者它们很大,最好将其单独收集起来。较小和/或较少的文档往往更适合嵌入。

🔗来源: stackoverflow.com

Q23:MongoDB 是无模式的吗?

主题:MongoDB
难度:⭐⭐⭐⭐

不。在 MongoDB 中,模式设计仍然很重要。然而,MongoDB 的文档模型采用了与传统关系数据库不同的模式范式。

在 MongoDB 中,文档是自描述的;没有用于声明和维护模式的中央目录。模式可以随文档而变化,并且可以快速演进,而无需修改现有数据。

MongoDB 的动态模式也使得表示半结构化和多态数据更加容易,因为所有文档不必都包含完全相同的字段。例如,一组金融交易头寸可能包含股票头寸、债券头寸和现金头寸。所有头寸可能包含一些共同的字段,但某些字段(“股票代码”、“股数”)并不适用于所有头寸类型。

🔗来源: mongodb.com

Q24:什么是主副本集和辅助副本集?

主题:MongoDB
难度:⭐⭐⭐⭐

  • 主节点 (Primary Node) 和主控节点 (Master Node) 是可以接受写入操作的节点。MongoDB 的复制是“单主”模式:一次只有一个节点可以接受写入操作。
  • 辅助节点和从属节点是从主节点复制的只读节点。

🔗资料来源: tutorialspoint.com

Q25:如何检查字段是否包含子字符串?

主题:MongoDB
难度:⭐⭐⭐⭐

考虑:

db.users.findOne({"username" : {$regex : ".*subsctring.*"}});
Enter fullscreen mode Exit fullscreen mode

🔗来源: stackoverflow.com

Q26:MongoDB 有哪些替代品?

主题:MongoDB
难度:⭐⭐⭐⭐

Cassandra、CouchDB、Redis、Riak、Hbase 是一些不错的选择。

🔗资料来源: interviewbubble.com

Q27:如何查找包含特定值的数组的文档?

主题:MongoDB
难度:⭐⭐⭐⭐⭐

你有这个模式:

person = {
    name : String,
    favoriteFoods : Array
}
Enter fullscreen mode Exit fullscreen mode

数组中favoriteFoods填充的是字符串。如何使用 MongoDB 查找所有以sushi为最爱食物的人?


考虑:

PersonModel.find({ favouriteFoods: "sushi" }, ...);
PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);
Enter fullscreen mode Exit fullscreen mode

🔗来源: docs.mongodb.com

Q28:是否可以使用另一个字段的值来更新 MongoDB 字段?

主题:MongoDB
难度:⭐⭐⭐⭐⭐

在 SQL 中我们将使用:

UPDATE Person SET Name = FirstName + ' ' + LastName
Enter fullscreen mode Exit fullscreen mode

使用 MongoDB 可以实现吗?


您目前还无法在更新中引用文档本身。您需要遍历文档并使用函数更新每个文档。
因此,请考虑:

db.person.find().snapshot().forEach(
  function(elem) {
    db.person.update({
      _id: elem._id
    }, {
      $set: {
        name: elem.firstname + ' ' + elem.lastname
      }
    });
  }
);
Enter fullscreen mode Exit fullscreen mode

🔗来源: stackoverflow.com

Q29:解释什么是水平可扩展性?

主题:MongoDB
难度:⭐⭐⭐⭐⭐

水平可扩展性是指通过连接多个硬件或软件实体,使它们作为单个逻辑单元工作,从而增加容量的能力。MongoDB 的核心功能之一就是提供水平可扩展性。

🔗来源: searchcio.techtarget.com

Q30:MongoDB 和 MySQL 有什么区别?

主题:MongoDB
难度:⭐⭐⭐⭐⭐

MongoDB 和 MySQL 之间的主要区别是:

  1. 这两个数据库中数据的表示形式有所不同。在 MongoDB 中,数据以 JSON 文档集合的形式呈现,而在 MySQL 中,数据则以表和行的形式呈现。在使用 PHP 时,JSON 文档类似于关联数组;在使用 Python 时,JSON 文档类似于目录对象。
  2. 查询时,您必须使用数据库系统能够解析的查询语言(SQL)来输入字符串。这种查询语言称为结构化查询语言(Structured Query Language),简称 SQL,MySQL 的名称也由此而来。这会导致您的数据库容易受到 SQL 注入攻击。另一方面,MongoDB 的查询是面向对象的,这意味着您需要向 MongoDB 传递一个文档来解释您正在查询的内容。MongoDB 完全不需要任何解析,如果您已经使用过 SQL,则需要一些时间来适应。
  3. 像 MySQL 这样的关系数据库最大的优势之一就是 JOIN 操作。该操作允许跨多个表进行查询。虽然 MongoDB 不支持连接操作,但它支持其他文档和数组等多维数据类型。
  4. 使用 MySQL,您可以将一个文档嵌入另一个文档中(即嵌入)。如果您使用 MySQL 创建博客,则需要分别创建一个用于评论的表和另一个用于帖子的表。在 MongoDB 中,每个帖子中只能有一个评论数组和一个帖子集合。
  5. MySQL 支持原子事务。一个事务中可以包含多个操作,并且可以像单个操作一样进行回滚。MongoDB 不支持事务,单个操作是原子的。
  6. MongoDB 的一大优点是您无需负责定义架构。您只需插入文档即可。集合中的任意两个文档不必位于同一字段。您必须在将数据存储在 MySQL 之前定义表和列。表中的所有行共享相同的列。
  7. MongoDB 的性能优于 MySQL 和其他关系型数据库。这是因为 MongoDB 牺牲了 JOINS 等操作,并提供了出色的性能分析工具。需要注意的是,您仍然需要对数据进行索引,而大多数应用程序中的数据量不足以让它们看到性能差异。MySQL 的性能不佳一直饱受诟病,尤其是在 ORM 应用程序中。但是,如果您进行了适当的数据索引并使用数据库包装器,则不太可能遇到问题。
  8. MySQL 相较于 MongoDB 等 NoSQL 的优势之一是 MySQL 的社区比 NoSQL 更完善。这主要是因为 NoSQL 相对较新,而 MySQL 已经存在多年。
  9. MongoDB 没有报告工具,这意味着性能测试和分析并非总是可行。MySQL 则提供多种报告工具,帮助您评估应用程序的有效性。
  10. 关系数据库系统 (RDBS) 基于一种名为 ACID 的范式运行,ACID 是原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation) 和持久性 (Durability) 的缩写。MongoDB 数据库不具备这种范式。
  11. MongoDB 具有 Map Reduce 功能,可轻松实现可扩展性。这意味着即使您使用低成本硬件,也可以获得 MongoDB 数据库的全部功能。
  12. 由于 MongoDB 是非关系型数据库,您无需构建详细的数据库模型。数据库架构师无需细粒度的数据库模型即可快速创建数据库,从而节省开发时间和成本。

🔗资料来源: analyticbridge.datasciencecentral.com

感谢🙌的阅读,祝你面试顺利!
如果喜欢,请分享给你的开发者同事!
更多 FullStack 面试问答,请访问👉 www.fullstack.cafe

文章来源:https://dev.to/aershov24/30-top-mongodb-interview-questions-and-answers-3d1p
PREV
2019 年 40 多个面向对象编程 (OOP) 面试题
NEXT
如何在 React 中管理 API 调用⚛️