如何在 Rocky Linux 9 上安装和使用 MongoDB NoSQL 数据库
本教程适用于这些操作系统版本
- 洛基Linux 9
- 洛基Linux 8.4
在此页
- 先决条件
- 添加 MongoDB 存储库
- 安装 MongoDB 服务器和 Mongosh
- 设置系统
- 为 MongoDB 设置管理员
- 在 MongoDB 上创建用户和数据库
- 在 MongoDB 中插入和查询数据
- 更新 MongoDB 中的数据
- 删除 MongoDB 中的数据
- 结论
MongoDB 是一个开源、跨平台、分布式的 NoSQL(非 SQL 或非关系)数据库系统。 MongoDB 不像传统的 SQL 数据库那样将数据存储在表中,而是使用灵活的文档来存储各种数据形式。 MongoDB 使用 BSON 格式存储数据,即二进制 JSON 格式。
MongoDB 是一个分布式 NoSQL 数据库,具有内置的高可用性、自动故障转移和数据冗余、通过跨分布式集群的分片进行水平扩展,并支持多区域地理部署。 MongoDB 还提供支持 CRUD 操作(读取和写入)、数据聚合管道、文本搜索和地理空间查询的查询 API。
一些使用 MongoDB 的著名公司有 Forbes、Toyota、SEGA、EA、Vodafone、Verizon 等等。
在本教程中,您将在 Rocky Linux 9 服务器上安装 MongoDB NoSQL 数据库。您还将学习如何优化 Linux 系统以部署 MongoDB 服务器。在本教程结束时,您还将学习 MongoDB 数据库服务器的基本查询。
通过完成本指南,您将安装 MongoDB 并学习基本的 MongoDB 操作,例如管理用户、创建数据库、从 MongoDB 插入和检索数据、更新 MongoDB 中的数据以及如何从 MongoDB 服务器删除数据。
先决条件
要完成本教程,您必须满足以下要求:
- Rocky Linux 9 服务器 - 此示例使用主机名为 mongodb-rocky 的 Rocky Linux。
- 具有 sudo/root 管理员权限的非 root 用户。
准备好 Rocky Linux 后,您现在就可以开始了。
添加 MongoDB 存储库
MongoDB 仅在官方 MongoDB 存储库中可用。要安装它,您必须将 MongoDB 存储库添加到您的系统中。在撰写本文时,最新版本的 MongoDB 是 v6.0,您将在本指南的其余部分使用它。
在第一步中,您将把官方 MongoDB 存储库添加到您的 Rocky Linux 系统中。
首先,使用以下 nano 编辑器命令创建一个新的存储库文件 /etc/yum.repos.d/mongodb-org-6.0.repo。
sudo nano /etc/yum.repos.d/mongodb-org-6.0.repo
将 MongoDB 6.0 存储库的以下行添加到文件中。
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
完成后保存文件并退出编辑器。
现在运行以下 dnf 命令来验证 Rocky Linux 系统上的存储库列表。
sudo dnf repolist
您将收到如下输出 - MongoDB 6.0 存储库已添加到 Rocky Linux 系统。

将 MongoDB 存储库添加到您的系统后,接下来您将开始安装 MongoDB。
安装 MongoDB 服务器和 Mongosh
在此步骤中,您将在 Rocky Linux 服务器上安装 MongoDB 服务器。然后,您将启动并启用 MongoDB 服务以在启动时自动运行。
运行以下 dnf 命令来安装 MongoDB 包。 mongodb-org是MongoDB服务端的主包,mongodb-mongosh是新版的MongoDB客户端,是客户端mongo的替代品。
sudo dnf install mongodb-org mongodb-mongosh
出现提示时,输入 y 确认并按 ENTER 继续。

此外,系统还会提示您接受 MongoDB 的 GPG 密钥。输入 y 并按 ENTER 确认。

安装 MongoDB 服务器后,运行以下 systemctl 命令实用程序以启动 MongoDB 服务并验证该服务以确保其运行。
sudo systemctl start mongod
sudo systemctl status mongod
您应该会收到如下图所示的输出 - MongoDB 服务正在运行并已启用。 MongoDB 服务将在启动时自动运行。

现在 MongoDB 服务器正在运行,您将在下一步中为 MongoDB 部署设置和优化 Rocky Linux 系统。
设置系统
在此步骤中,您将设置 Rocky Linux 服务器并针对 MongoDB 部署对其进行优化。这包括禁用透明大页面 (THP)、增加 ulimit 以及通过 sysctl.conf 文件增加最大虚拟内存。
您可以使用不同的方法来禁用透明大页面 (THP)。在本指南中,您将通过 systemd 服务永久禁用 THP。
使用以下 nano 编辑器命令创建一个新的 systemd 服务文件 /etc/systemd/system/disable-thp.service。
sudo nano /etc/systemd/system/disable-thp.service
将以下行添加到文件中。
[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"
[Install]
WantedBy=multi-user.target
保存文件并退出编辑器。
接下来,运行以下 systemctl 命令实用程序以重新加载 systemd 管理器并应用新的服务文件。
sudo systemctl daemon-reload
之后,使用以下 systemctl 命令启动并启用 systemd 服务 disable-thp。
sudo systemctl enable disable-thp
sudo systemctl start disable-thp
启用 disable-thp 服务后,Transparent Huge Pages (THP) 将在每次启动时自动禁用。

接下来,您将为 MongoDB 部署增加系统上的 ulimit。通用 Linux 系统的默认 ulimit 是 1024,而 MongoDB 至少需要 64000。
要更改 ulimit,请使用以下 nano 编辑器命令创建一个新的配置文件 /etc/security/limits.d/mongodb.conf。
sudo nano /etc/security/limits.d/mongodb.conf
将以下行添加到文件中。通过这些行,您将为特定用户 mongod 设置 ulimit,这是运行 MongoDB 服务器的默认用户。
mongod soft nproc 64000
mongod hard nproc 64000
mongod soft nofile 64000
mongod hard nofile 64000
完成后保存文件并退出编辑器。
配置 ulimit 后,您现在将通过 /etc/sysctl.conf 文件增加 MongoDB 服务器上的最大虚拟内存。
使用以下 nano 编辑器命令打开配置文件 /etc/sysctl.conf。
sudo nano /etc/sysctl.conf
将以下行添加到文件中。
fs.file-max = 2097152
vm.max_map_count = 262144
vm.swappiness = 1
保存文件并退出编辑器。

最后,运行下面的命令来重启你的 Rocky Linux 系统并应用你所拥有的系统更改模式。
sudo reboot
这样,您的 MongoDB 服务器现在应该在禁用 THP、MongoDB 用户的 ulimit 64000 和最大虚拟内存 262144 的情况下运行。在下一步中,您将设置 MongoDB 管理员用户,然后学习 MongoDB 操作的基础知识。
为 MongoDB 设置管理员
此时,您已经在优化的 Rocky Linux 服务器上运行 MongoDB。在这一步中,您将通过创建一个新的管理员用户并在 MongoDB 服务器上启用身份验证和授权来保护您的 MongoDB 部署。
首先,通过下面的 mongosh 命令登录到 MongoDB 服务器。
mongosh

现在运行以下查询以禁用在默认 MongoDB 安装中启用的 MongoDB 监控。
db.disableFreeMonitoring()

接下来,使用以下查询切换到默认数据库管理员。
use admin
现在使用以下 MongoDB 查询创建一个新的 MongoDB 管理员用户。另外,请务必更改以下查询中的用户名。
此示例将创建一个新的管理员用户 myAliceAdmin。使用查询 passwordPrompt(),您将通过提示设置密码,而不是在查询中使用纯文本。
db.createUser(
{
user: "myAliceAdmin",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
创建新用户后,您将收到诸如 { ok: 1 } 之类的输出。

现在按 Ctrl+d 或键入 quit 退出 MongoDB shell。
接下来,使用以下 nano 编辑器命令打开 MongoDB 配置文件 /etc/mongod.conf。
sudo nano /etc/mongod.conf
取消注释安全参数并添加行 authorization: enabled 以启用 MongoDB 身份验证和授权。
security:
authorization: enabled
完成后保存文件并退出编辑器。
最后,运行以下 systemctl 命令重新启动 MongoDB 服务并应用更改。
sudo systemctl restart mongod
现在已经创建了 MongoDB 管理员用户,并且在 MongoDB 服务器上启用了授权和身份验证。接下来,您将使用两种不同的方法验证用户身份验证。
通过下面的 mongosh 命令登录到 MongoDB shell。
mongosh
登录后,运行以下查询以验证为 MongoDB 管理员用户 myAliceAdmin。当提示输入密码时,输入您的 MongoDB 管理员密码。
use admin
db.auth("myAliceAdmin", passwordPrompt())
身份验证成功后,您应该会收到类似 { ok: 1 } 的输出。

登录 MongoDB shell 并使用下面的单个 mongosh 命令进行身份验证的另一种方法。出现提示时输入您的密码。
使用此命令,您将连接到在端口 27017 上运行的 MongoDB 服务器,并使用用户名 myAliceAdmin 向数据库管理员进行身份验证。
mongosh --port 27017 --authenticationDatabase \
"admin" -u "myAliceAdmin" -p
身份验证成功后,您应该登录到 MongoDB shell。

您的 MongoDB 服务器现在受到用户和密码身份验证的保护。此外,您还在 MongoDB 上创建了一个管理员用户。接下来,您将学习如何创建可用于您的应用程序的新 MongoDB 用户。
在 MongoDB 上创建用户和数据库
在此步骤中,您将创建一个可用于您的应用程序的新 MongoDB 用户。除此之外,您还将验证 MongoDB 服务器上的用户列表,然后使用您的 MongoDB 新用户登录到 MongoDB shell。
在开始之前,请确保您已登录到 MongoDB shell。然后,运行以下命令切换到新数据库 testdb 并创建一个新的 MongoDB 用户。
在此示例中,您将创建一个新的 MongoDB 用户 myTestUser,其角色为数据库 testdb 的读写角色和数据库报告的只读角色。
use tesdb
db.createUser(
{
user: "myTestUser",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "readWrite", db: "testdb" },
{ role: "read", db: "reporting" } ]
}
)
出现提示时,输入新用户 myTestUser 的新密码。您应该会收到一个输出 { ok: 1 },这意味着新用户 myTestUser 已创建。

接下来,切换到数据库管理员并运行以下查询来验证 MongoDB 服务器上的用户列表。
use admin
db.system.users.find()
您将看到类似于此的输出 - 创建了新用户 myTestUser,其角色为 readWrite 数据库 testdb 和 read 数据库报告角色。
现在按 Ctrl+d 退出并退出 MongoDB shell。

为确保创建了 MongoDB 用户 myTestUser,您现在将通过 myTestUser 登录到 MongoDB。
运行以下命令以用户 myTestUser 登录 MongoDB。当提示输入密码时,输入您的密码。
mongosh --port 27017 -u "myTestUser" \
--authenticationDatabase "testdb" -p
登录后,运行以下 MongoDB 查询以验证您当前的连接。
db.runCommand({connectionStatus : 1})
您将看到类似于此屏幕截图的输出 - 您现在已经通过用户 myTestUser 连接到 MongoDB 服务器并进行了身份验证。

现在您已经创建了一个新的 MongoDB 用户,接下来您将学习如何在 MongoDB 中插入和检索数据。
在 MongoDB 中插入和查询数据
创建新的 MongoDB 用户后,您现在将学习如何创建数据库、插入数据以及从 MongoDB 检索数据。您将学习如何使用 insertOne 查询和 insertMany 查询将数据添加到 MongoDB,以及如何使用查询运算符(例如 $in 和 $gte)以及 find 查询从 MongoDB 中检索数据。
首先,确保你已经用你的新用户登录到 MongoDB 服务器,这个例子是 myTestUser。然后通过下面的use查询切换到数据库testdb。
use testdb
现在你的 MongoDB shell 会变成 likes testdb>。
接下来,运行以下查询以创建一个新集合并将新数据插入其中。在此示例中,您将创建一个新集合电影并通过 insertOne 查询插入新数据,该查询可用于仅将一个数据插入集合。
db.movies.insertOne(
{
title: "The Hobbit",
genres: [ "Adventure", "Fantasy" ],
runtime: 172,
rated: "R",
year: 2012,
directors: [ "Peter Jackson" ],
cast: [ "Martin Freeman", "Ian McKellen", "Richard Armitage" ],
type: "movie"
}
)
您现在将收到诸如 acknowledged: ok 之类的输出,这意味着添加了新数据并创建了新集合。

现在运行以下查询来验证数据库 testdb 上的集合列表并显示 testdb 中的可用数据。
show collection 查询将显示当前数据库中的集合/表列表,find 查询将显示数据库中的可用数据。您还可以通过查找查询过滤特定字段。
show collections
db.movies.find( {} )
您应该收到这样的输出 - 电影集合在 testdb 数据库中可用。此外,您还将添加已添加的新数据,即

接下来,您还可以通过 insertMany 查询一次添加多个数据。运行以下查询以通过 insertMany 查询将两个数据插入电影集合。
db.movies.insertMany([
{
title: "The Lord of the Rings",
genres: [ "Action", "Adventure", "Drama" ],
runtime: 240,
rated: "PG-13",
year: 2001,
directors: [ "Peter Jackson" ],
cast: [ "Elijah Wood", "Ian McKellen", "Orlando Bloom" ],
type: "movie"
},
{
title: "Harry Potter",
genres: [ "Adventure", "Family", "Fantasy" ],
runtime: 140,
rated: "R",
year: 2007,
directors: [ "David Yates" ],
cast: [ "Daniel Radcliffe", "Emma Watson", "Rupert Grint" ],
type: "movie"
}
])
输出:

现在运行下面的查找查询来检索您的数据。有了这个,您将使用过滤器控制器检索数据:\Peter Jackson\。
db.movies.find( { directors: "Peter Jackson" })
您将收到这样的输出 - 任何导演的电影:\Peter Jackson\ 都将显示在您的终端上。

接下来,您还可以使用查询运算符在查找查询中指定条件。
运行以下查询以检索类型为 Action 和/或 Family 的任何数据。 $in 运算符可用于检索与数组中指定的任何值匹配的数据。
db.movies.find( { genres: { $in: [ "Action", "Family" ] } } )
您现在应该收到如下输出:

您可以尝试的另一个查询运算符是 $gte,它可用于检索大于或等于指定值的数据。
在此之前,运行以下查询以将新数据插入电影集合。
db.movies.insertOne(
{
title: "Transformers",
genres: [ "Adventure", "Action", "Sci-Fi" ],
runtime: 150,
rated: "PG-13",
year: 2007,
directors: [ "Michael Bay" ],
cast: [ "Shia LaBeouf", "Megan Fox", "Josh Duhamel" ],
type: "movie"
}
)
现在运行以下查询以使用 $gte 查询运算符检索数据。这将检索类型为 \Action\ 且在 2001 年之后或等于 2001 年发行的所有电影。
db.movies.find( { genres: "Action", "year": { $gte: 2001 } } )
您将收到类似于此的输出 - 在此示例中,您将获得两部在 2001 年之后或等于 2001 年发行的类型为动作的电影,它们是指环王和变形金刚。

考虑到这一点,您现在已经了解了如何在 MongoDB 中插入和检索数据。您已经学习了用于添加一个数据的基本查询 insertOne 和用于一次添加一些数据的 insertMany 查询。
然后,您还学习了查找查询从 MongoDB 检索数据的基本用法。除此之外,您还学习了如何在 MongoDB 中使用运算符查询 $in 和 $gte。
在下一步中,您将学习如何更新 MongoDB 集合中的数据。
更新 MongoDB 中的数据
在此步骤中,您将学习如何使用两个查询更新 MongoDB 中的数据,updateOne 用于更新文档中的一个字段,并使用 replaceOne 将第一个匹配的数据完全替换为新数据。
要更新 MongoDB 中的数据,您可以使用多种方法和查询。在此示例中,您将学习如何使用 updateOne 和 replaceOne 查询。 updateOne 查询可用于更新文档中的单个字段,而 replaceOne 将替换整个文档。
运行以下查询以使用 updateOne 查询更新数据。在此示例中,您将更新电影变形金刚中的评级:\PG-13\ 至评级:\R\。
db.movies.updateOne( { title: "Transformers" },
{
$set: {
rated: "R"
}
})
您应该会收到诸如 matchedCount: 1 和 modifiedCount: 1 之类的输出。

现在使用以下查询验证新数据。您应该会看到变形金刚电影中的数据已更新。
db.movies.find( { title: "Transformers" })

接下来,运行下面的 replaceOne 查询来替换过滤器中第一个匹配的数据,并用新数据替换整个文档。在此示例中,您将用新数据替换电影《变形金刚》中的整个文档。
db.movies.replaceOne(
{ title: "Transformers" },
{
title: "Transformers: Dark of the Moon",
genres: [ "Adventure", "Action", "Sci-Fi" ],
runtime: 160,
rated: "PG-13",
year: 2011,
directors: [ "Michael Bay" ],
cast: [ "Shia LaBeouf", "Rosie Huntington-Whiteley", "Tyrese Gibson" ],
type: "movie"
}
)
你现在应该得到这样的输出。

现在运行以下查询来验证 MongoDB 上新更新的数据。
db.movies.find( { title: "Transformers" })
db.movies.find( { title: "Transformers: Dark of the Moon" })
您应该收到类似于此的输出 - 电影变形金刚被删除/替换为新电影变形金刚:月黑之时。

删除 MongoDB 中的数据
在这一步中,您将学习如何删除 MongoDB 文档中的数据。然后,您将学习如何在 MongoDB 中删除数据库和删除用户。
运行以下命令从 MongoDB 集合中删除数据。在此示例中,您将通过 deleteMany 查询删除整个文档 Transformers: Dark of the Moon。
db.movies.deleteMany( { title: "Transformers: Dark of the Moon" } )
db.movies.find( { title: "Transformers: Dark of the Moon" })
您应该会收到诸如 deletedCount: 1 之类的输出。

接下来,运行以下命令通过下面的 deleteOne 查询删除单个文档。这将删除过滤器中第一个匹配的数据。
在此示例中,您将删除与 cast 匹配的第一个文档:\Ian McKellen\。
db.movies.deleteOne( { cast: "Ian McKellen" } )
db.movies.find( { cast: "Ian McKellen" })
下面是删除数据前后的输出。
删除之前 - 您应该会看到两部电影的演员阵容:“Ian McKellen”。

删除文档后 - 您应该只会看到一部带演员表的电影:“Ian McKellen”。

接下来,您将学习如何删除 MongoDB 中的用户和数据库。要删除 MongoDB 中的用户,您的 MongoDB 管理员用户必须具有 root 角色。
运行以下命令以 MongoDB 管理员用户 myAliceAdmin 身份验证并输入您的密码。
use admin
db.auth("myAliceAdmin", passwordPrompt())
在通过 MongoDB 管理员身份验证后,运行以下查询以授予管理员用户根角色。
db.grantRolesToUser("myAliceAdmin", ["root"]);

现在切换到 testdb 并通过以下查询删除数据库 testdb 中的用户。这将从 MongoDB 中删除用户 myTestUser。
use testdb
db.runCommand( { dropAllUsersFromDatabase: 1 } )
你应该得到一个输出,比如 { n:1, ok: 1 }。
接下来,运行以下查询以删除/删除数据库 testdb。
db.dropDatabase()
你应该得到一个输出,比如 { ok: 1, dropped: testdb }。

现在数据库中的 testdb 和用户已被删除。
运行以下查询以切换到数据库管理员并验证 MongoDB 服务器上的数据库列表。您应该会看到 testdb 数据库已被删除。
use admin
show dbs

最后,运行以下查询以显示和列出 MongoDB 上的用户。
db.system.users.find()
您应该会收到这样的输出 - 使用 myTestUser 已从 MongoDB 服务器中删除/删除。

结论
在本指南中,您已经在 Rocky Linux 9 服务器上安装了最新版本的 MongoDB 服务器(社区版)。您还学习了如何在 MongoDB 服务器上启用身份验证和授权,以及如何为 MongoDB 部署优化 Linux 服务器。
在此过程中,您了解了用于连接和管理 MongoDB 服务器的 Mongosh 命令的基本用法。并学习了用于创建用户、创建数据库、插入和检索数据、更新数据以及从 MongoDB 服务器删除/删除数据的基本 MongoDB 查询。
有了这个,您可以在 MongoDB 文档中了解有关 MongoDB 查询的更多信息。此外,如果您有兴趣在大型部署中部署 MongoDB,您可以尝试启用允许您在 MongoDB 集群中设置水平扩展的分片。