MongoDB 简介
在处理数据时,我们知道有两种类型的数据——(i)结构化数据和(ii)非结构化数据。结构化数据通常以表格形式存储,而非结构化数据则不然。为了管理大量非结构化数据(如日志或物联网数据),使用了 NoSQL 数据库。
现在,什么是 MongoDB?
- MongoDB 是一个用 C++ 语言编写的开源 NoSQL 数据库。它使用带有可选模式的类似 JSON 的文档。
- 它提供了简单的可扩展性,是一个跨平台、面向文档的数据库。
- MongoDB 基于集合和文档的概念。
- 它结合了横向扩展的能力和二级索引、范围查询、排序、聚合和地理空间索引等功能。
- MongoDB 由 MongoDB Inc. 开发并根据服务器端公共许可证 (SSPL) 获得许可。
MongoDB面试题解析:MongoDB 的一些优点如下:
- MongoDB 支持字段、基于范围、字符串模式匹配类型的查询。用于搜索数据库中的数据
- MongoDB 支持任何字段的一级和二级索引
- MongoDB 基本上使用 JavaScript 对象代替过程
- MongoDB 使用动态数据库模式
- 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 使用配置服务器来管理分布式锁。每个分片集群必须有自己的配置服务器。
文章图片
7. MongoDB 有哪些特点?
- 索引:它支持通用二级索引并提供独特的、复合的、地理空间的和全文索引功能。
- 聚合:它提供了一个基于数据处理管道概念的聚合框架。
- 特殊集合和索引类型:它支持应在特定时间到期的数据的生存时间 (TTL) 集合
- 文件存储:支持易于使用的协议,用于存储大文件和文件元数据。
- 分片:分片是跨机器拆分数据的过程。
向 MongoDB 添加数据的基本方法是“插入”。要插入单个文档,请使用集合的
insertOne
方法:> db.books.insertOne({"title" : "Start With Why"})
为了将多个文档插入到一个集合中,我们使用
insertMany
.
此方法允许将文档数组传递到数据库。9. 如何更新文档?
一旦文档存储在数据库中,就可以使用以下几种更新方法之一进行更改:
updateOne
、updateMany
和replaceOne. updateOne
和updateMany
每个都将过滤器文档作为它们的第一个参数,将描述要进行的更改的修饰符文档作为第二个参数。replaceOne
也将过滤器作为第一个参数,但作为第二个参数replaceOne
需要一个文档,它将替换与过滤器匹配的文档。例如,为了替换文档:
{
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"name" : "alice",
"friends" : 24,
"enemies" : 2
}
10. 如何删除文档?
MongoDB面试题解析:MongoDB 中的 CRUD API 提供
deleteOne
并deleteMany
为此目的。这两种方法都将过滤器文档作为它们的第一个参数。过滤器指定一组标准以匹配删除文档。例如:
> 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() { /* ... */ }}
当你构建需要快速发展和优雅扩展的互联网和业务应用程序时,你应该使用 MongoDB。MongoDB 深受使用敏捷方法构建可扩展应用程序的各类开发人员的欢迎。
如果需要,MongoDB 是一个不错的选择:
- 支持快速迭代开发。
- 扩展到高水平的读写流量 - MongoDB 支持通过分片进行水平扩展,将数据分布在多台机器上,并促进大数据集的高吞吐量操作。
- 将你的数据存储库扩展到一个巨大的规模。
- 随着业务的变化发展部署类型。
- 使用文本、地理空间或时间序列维度存储、管理和搜索数据。
该
find
方法用于在 MongoDB 中执行查询。查询返回集合中文档的子集,从根本没有文档到整个集合。返回哪些文档由 find 的第一个参数决定,这是一个指定查询条件的文档。例如:如果我们有一个想要匹配的字符串,例如一个值为“alice”的“username”键,我们将使用该键/值对:
>
db.users.find({"username" : "alice"})
15. 解释 MongoDB 中的“索引”一词。
在 MongoDB 中,索引有助于有效地解析查询。索引的作用是以易于遍历的形式存储一小部分数据集。索引存储特定字段或字段集的值,按索引中指定的字段值排序。
MongoDB 的索引与典型的关系数据库索引的工作方式几乎相同。
索引查看包含内容引用的有序列表。这些反过来又允许 MongoDB 查询数量级更快。要创建索引,请使用
createIndex
集合方法。例如:
>
db.users.find({"username": "user101"}).explain("executionStats")
在这里,
executionStats
mode 帮助我们理解使用索引来满足查询的效果。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”的错误处理逻辑。
MongoDB Charts 是 MongoDB 中用于数据可视化的新集成工具。
MongoDB Charts 提供了使用来自 MongoDB 数据库的数据创建可视化的最佳方式。
它允许用户从数据库执行快速数据表示,而无需使用 Java 或 Python 等编程语言编写代码。
MongoDB Charts 的两种不同实现是:
- MongoDB Charts PaaS(平台即服务)
- MongoDB 图表服务器
- 聚合框架是 MongoDB 中的一组分析工具,允许你对一个或多个集合中的文档进行分析。
- 聚合框架基于管道的概念。使用聚合管道,我们从 MongoDB 集合中获取输入,并将该集合中的文档通过一个或多个阶段传递,每个阶段对其输入执行不同的操作(见下图)。每个阶段都将其作为输出产生之前的任何阶段作为输入。所有阶段的输入和输出都是文档——一个文档流。
【求职面试必备(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 中默认启用。
MongoDB面试题解析:mongo shell 不包括导出、导入、备份或恢复的功能。但是,MongoDB 已经创建了用于完成此操作的方法,因此不需要编写脚本或复杂的 GUI。为此,提供了几个实用程序脚本,可用于将数据批量输入或输出数据库。这些实用程序脚本是:
- mongoimport
- mongoexport
- mongodump
- mongorestore
MongoDB 是一个功能强大、灵活且可扩展的通用数据库。它结合了横向扩展的能力和二级索引、范围查询、排序、聚合和地理空间索引等功能。
因此,总而言之,MongoDB 是:
- 支持索引
- 为扩展而设计
- 功能丰富
- 高性能
- 负载均衡
- 支持分片
以下是一些深入了解MongoDB的参考资料:
https://www.mongodb.com/2
https://docs.mongodb.com
推荐阅读
- Java 8常见面试题整理合集(求职面试必备)
- 求职面试必备(AWS面试题和答案合集)
- React Native常见面试题整理(问题和解答)
- 求职面试总结(操作系统常见面试题和答案合集)
- Kubernetes经典面试题整理合集(问题和答案解答)
- Django求职面试笔记(面试题和答案合集)
- 求职面试笔记(ASP.NET常见面试题整理和解答)
- 求职面试必备(Laravel常见面试题和答案笔记)
- CSS常见面试题笔记整理(问题和答案解答)