Skip to content

Latest commit

 

History

History
1082 lines (650 loc) · 61 KB

File metadata and controls

1082 lines (650 loc) · 61 KB

三、服务器和客户端

概述

本章介绍 MongoDB Atlas 云服务的网络和数据库访问安全。您将了解 MongoDB 客户端以及如何将客户端连接到云数据库以运行 MongoDB 命令。您将使用 Atlas 云安全配置创建和管理用户身份验证和授权,并为 MongoDB 数据库创建用户帐户。连接到 MongoDB 数据库后,您将探索 Compass GUI 客户机中的 MongoDB 服务器命令。

导言

我们探讨了云计算中 MongoDB 数据库的基础知识,并了解了 MongoDB 与其他数据库的不同之处。第 2 章文档和数据类型解释了 MongoDB 中使用的数据结构。现在,您已经知道如何连接到 MongoDB Atlas 控制台,以及如何使用 Data Explorer 浏览数据库。在本章中,您将继续进入 MongoDB 世界,连接并访问新的 MongoDB 数据库,并发现其内部架构和命令。

在当今世界,互联网和云计算是决定现有和未来应用程序规则的主要驱动力。到目前为止,我们已经了解到 MongoDB Atlas 是 MongoDB 的一个强大的云版本,为客户端提供性能、安全性和灵活性。虽然云基础设施为用户提供了许多好处,但它也增加了与云中存储的数据相关的安全风险。网络安全事件经常出现在新闻中。2013 年,目标公司发生了一起此类事件,当时他们成为大型网络攻击的受害者,超过 1 亿客户的个人数据被盗。

MongoDB Atlas 服务的优点之一是默认情况下启用了许多安全功能,从而可以防止互联网上的攻击。因此,了解配置 Atlas 安全性的基础知识非常重要。

考虑一个场景,在这个场景中,您正在基于 MunGDB 进行项目。来自 IT 部门的同事已经在 Atlas 云中部署了一个新的 MongoDB 数据库,并向您发送了连接详细信息。但是,在查看之后,您发现由于网络和用户访问的安全规则,您无法连接到新数据库。首先要配置的是为自己提供对新数据库的访问权限。您还需要确保访问将继续被禁用,以便通过 internet 进行未经授权的访问。

要配置对项目数据库的访问,必须记住两个关键方面:

  • 网络接入:配置 IP 网络接入
  • 数据库访问:配置用户和数据库角色

网络接入

安装并运行数据库后的第一步是能够成功连接到数据库。网络访问是一种低级安全配置,可用于部署在 Atlas 云中的数据库。

对于本地安装在笔记本电脑上的数据库,我们通常不需要配置任何网络安全。连接被定向到本地安装的数据库。但是,对于部署在云基础设施上的数据库,安全性在默认情况下处于启用状态,需要进行配置。保护对数据库的访问是非常重要的,这样可以保护数据不被未经授权的互联网访问。在学习如何在 MongoDB 中配置网络访问之前,让我们先了解一下它的一些核心基础概念。

网络协议

互联网协议IP)是一个已有数十年历史的标准,传输控制协议/互联网协议TCP/IP)是所有应用程序用于在互联网上可靠传输数据包的传输协议。internet 上的每台计算机或设备都有其唯一的 IP 地址或主机名。通过在网络数据包报头中包含源 IP 地址和目标 IP 地址,可以实现设备之间的通信。

笔记

网络分组报头是在数据分组的开始处发现的附加数据段,包含关于分组所携带的数据的信息。此信息包括源 IP、目标 IP、协议和其他信息。

MongoDB 在使用 TCP/IP 作为其网络协议传输数据方面也不例外。此外,目前 IP 有两个版本:IPv4 和 IPv6。Atlas 云平台支持这两个版本。IPv4 定义了标准的 4 字节(32 位)地址,而 IPv6 定义了标准的 16 字节(128 位)地址。

IPv4 和 IPv6 都用于指定 internet 上设备的完整地址。最新的标准 IPv6 旨在克服 IPv4 协议的限制。IP 地址有两部分:IP 网络和 IP 主机地址。网络掩码是用于指示 IP 地址的网络和主机部分的位序列(掩码)。网络地址是 IP 地址的前缀,而主机地址是剩余地址(IP 地址的后缀):

Figure 3.1: Diagrammatic representation of an IP address

图 3.1:IP 地址的图示

图 3.1中,网络掩码 255.255.0.0(或(1111111111)。(1111111)。(0000 0000)(二进制格式)用作掩码,指示地址的 IP 网络和 IP 主机部分。地址(前缀)的 IP 网络部分由通用 IPv4 地址的前 16 位(100.100)组成,而主机地址是地址的其余部分(20.50)。

MongoDB Atlas 使用无类域间路由CIDR符号代替 IP 网络掩码来指定 IP 地址。CIDR 格式是一种较短的格式,用于描述 IP 网络和主机格式。此外,CIDR 比旧的 IP 网络掩码表示法更灵活。

以下是网络掩码及其等效 CIDR 符号的示例:

Figure 3.2: Netmask and its CIDR notation

图 3.2:网络掩码及其 CIDR 符号

它们都描述了相同的 IP 网络–54.175.147.0(左起 24 位,或 3 个字节),主机号–155。此网络中可能有 254 个主机(从 1 到 254)。

笔记

本课程的目标不在于提供一份全面的互联网标准指南。详见了解 TCP/IPhttps://www.packtpub.com/networking-and-servers/understanding-tcpip ),这是一个关于 TCP/IP 协议的清晰而全面的指南。

公共 IP 地址与私有 IP 地址

如前所述,任何连接到 internet 的设备都需要唯一的 IP 地址才能与其他服务器通信。这些类型的 IP 地址称为公共IP 地址。除了公共 IP 之外,互联网标准还定义了一些保留供私人使用的 IP 地址,称为专用IP 地址。在需要限制员工访问专用网络(intranet)而不是让他们访问公共互联网的公司环境中,这些功能更常用。

下表介绍了 IP 版本 4 可用的专用 IP 地址。

Figure 3.3: Private IP addresses for IP4

图 3.3:IP4 的专用 IP 地址

另一方面,公共 IP 地址在互联网上是唯一的,可以具有与图 3.3中不同的任何值。

域名服务器

让我们考虑一个例子,其中 IP 地址 Po.T05.52.206222.245 AUTYT1 是 MangGDB 网站的公共 IP 地址:

C:\>ping mongodb.com
Pinging mongodb.com [52.206.222.245] with 32 bytes of data:
Reply from 52.206.222.245: bytes=32 time=241ms TTL=48
Reply from 52.206.222.245: bytes=32 time=242ms TTL=48
Reply from 52.206.222.245: bytes=32 time=243ms TTL=48
Ping statistics for 52.206.222.245:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 241ms, Maximum = 250ms, Average = 244ms

如您所见,我们使用名称mongodb.com来运行 ping 命令,而不是直接使用 mongodb 网站的 IP 地址。域名服务器DNS)是解析互联网主机名的解决方案。客户端向 DNS 服务器查询特定主机名或域(在本例中为mongodb.com),DNS 服务器响应该主机和域注册的公共 IP 地址:IP54.175.147.155

传输控制协议

传输控制协议TCP是 IP 地址的一部分,定义了可用于不同类型网络连接的套接字或端口。需要通过 internet 进行通信的每个进程都使用 TCP 端口建立连接。

MongoDB 服务器的默认 TCP 端口为 27017。在 MongoDB Atlas 免费层中,无法更改默认 TCP 端口。这是 Atlas free tier M0 服务器的限制之一。但是,在本地安装上,可以在服务器启动时配置 TCP 侦听器端口。

MongoDB Atlas 云始终加密服务器和应用程序之间的网络通信。使用称为 TLS(传输层安全)的专用网络加密协议保护数据。

TCP/IP 通信有几个重要方面需要记住:

  • 服务器始终侦听来自客户端的新连接,通常在 TCP 端口 27017 上。
  • 客户端总是通过发送一个特殊的 TCP 数据包来启动与服务器的连接。
  • 如果配置了网络访问,客户端可以与数据库服务器建立 TCP 连接。
  • 只有当客户端通过安全检查时,服务器才接受连接。
  • Atlas 云中的数据库的网络通信总是加密的。
  • 建立连接后,客户端通过发送数据库命令和接收数据与服务器通信。

有线协议

在内部,MongoDB 以一种称为二进制 JSONBSON的特殊二进制格式存储文档。我们在第 2 章文档和数据类型中了解了 JSON 文档的结构。BSON 是一种比 JSON 更有效的数据存储方式。因此,MongoDB 使用 BSON 将数据存储在文件中,并通过网络传输数据。

Wire 协议是 MongoDB 的解决方案,用于将 BSON 数据封装到可以通过 internet 发送的网络数据包中。Wire 协议以 MongoDB 服务器和客户端都能理解的格式定义标准数据报或数据包。数据报的结构由头和体组成,采用 MongoDB 定义的简单但严格的格式。有线协议数据报也封装在 TCP/IP 数据包中,如下图所示:

Figure 3.4: Encapsulated Wire Protocol datagrams

图 3.4:封装有线协议数据报

网络接入配置

Atlas 项目所有者或群集管理者可以从 Atlas web 管理控制台修改网络访问。登录 Atlas 控制台后,您可以从 Atlas web 控制台的安全菜单访问网络访问选项卡:

Figure 3.5: MongoDB Atlas console

图 3.5:MongoDB Atlas 控制台

页面右侧出现网络接入配置页面。MongoDB Atlas 包含三种管理网络访问的方法,可使用以下选项卡访问:

  • IP 接入列表
  • 对等
  • 专用端点

IP 访问列表

IP 访问列表帮助 Atlas 管理员指定允许连接 MongoDB 数据库的有效 IP 地址列表。要添加你的第一个 IP 地址,你可以点击绿色按钮 ORT T2。

笔记

如果您已经添加了一个(或几个)IP 地址,则在网络接入 IP 列表右侧会显示**+添加 IP 地址**按钮,如图 3.6所示。

Figure 3.6: Adding an IP address list

图 3.6:添加 IP 地址列表

当您点击添加 IP 地址按钮(或**+添加 IP 地址**时,会出现一个弹出窗口:

Figure 3.7: Adding a new IP access list entry

图 3.7:添加新的 IP 访问列表条目

添加 IP 访问列表表单中提供以下选项:

  • 添加当前 IP 地址:这是最常用的方法,可以用于简单的部署。它允许您将自己的 IP 地址添加到 IP 访问列表中,如图 3.7所示。Atlas 自动从 web 管理控制台的当前会话检测 IP 源地址,因此您不必记住 IP 地址。最有可能的是,您的计算机具有来自私有 IP 类的内部 IP 地址,例如 192.168.0.xx,这与 Atlas 检测到的地址大不相同。这是因为 Atlas 始终检测网络网关的外部 IP 地址,而不是内部网络专用 IP 地址。专用 IP 地址在 internet 上不可见。您可以通过搜索**什么是我的 IP 来验证您的外部 IP 地址?**在谷歌。谷歌搜索的结果应该与 Atlas 中的地址匹配。

  • ALLOW ACCESS FROM ANYWHERE: As the name suggests, this option enables network access from any location by disabling the network protection for your database, as shown in Figure 3.7. The special IP class 0.0.0.0/0 is added to the IP access list.

    笔记

    不建议使用允许从任何地方访问的选项,因为它将禁用网络安全保护,并使我们的云数据库面临可能的攻击。

IP 列表条目字段中添加自定义 IP 地址时,IP 地址需要采用 CIDR 表示法,如本章引言所述。也可以在注释字段中键入简短说明,如图 3.8所示:

Figure 3.8: Filling in the Comment field in the IP Access list entry

图 3.8:填写 IP 访问列表条目中的注释字段

笔记

在当前版本的 Atlas 控制台中,无法将主机名或完全限定域名FQDN)添加到 IP 访问列表中。只接受 IP 地址作为有效条目。MongoDB Atlas 同时支持 IPv4 和 IPv6。例如,不可能添加主机名,例如server01prdserver01prd.mongodb.com(包括域),而是添加主机公共 IP 地址。IP 地址可以通过 DNS 查找或 ping 主机名获得。

临时通道

访问列表中的条目可以是永久的,也可以有过期时间。临时条目到期时将自动从列表中删除。如果您希望添加临时 IP 地址,请检查交换机该条目是临时的,将在添加 IP 访问列表条目表单的选项中删除,如图 3.9所示。您可以使用下拉列表指定过期时间:

Figure 3.9: Adding a temporary IP Access list entry

图 3.9:添加临时 IP 访问列表条目

当您点击确认时,IP/主机地址保存在访问列表中,网络配置被激活。流程通常在不到一分钟内完成,在此期间,进入状态将为待定几秒钟,如图 3.10所示:

Figure 3.10: Network access window displaying the Pending status

图 3.10:显示挂起状态的网络访问窗口

一旦网络配置被激活,状态将变为激活,如图 3.11所示:

Figure 3.11: Network Access window

图 3.11:网络访问窗口

笔记

一条消息说**您将只能从以下 IP 地址列表连接到集群:**出现在屏幕上,通知用户可用 IP 地址列表,如图 3.11所示。

在 IP 访问列表中保存 IP 后,管理员可以修改条目。从动作页签可以访问以下操作的权限,如图 3.11所示:

  • 单击删除从 IP 访问列表中删除现有条目。

  • Edit an existing entry from the IP access list by clicking EDIT.

    笔记

    您可以将多个 IP 地址添加到访问列表中。例如,如果需要从办公室和家中访问云数据库,则可以将这两个 IP 地址都添加到访问列表表中。不过,请注意,列表中最多可以添加 200 个地址。

网络对等

网络对等是 Atlas 云基础设施上控制网络访问的另一种方法,与 IP 访问列表不同。它使公司能够在本地公司网络和 Atlas 网络基础设施之间建立虚拟私有云VPC连接,如下所示:

  • 专用 IP 网络用于在客户端专用网络和 MongoDB Atlas 服务器之间配置 VPC。VPC 网络对等支持任何类型的专用 IP。

  • 所有云提供商都支持网络对等,如 AWS、微软或谷歌的云基础设施。

  • Network peering is appropriate only for large implementations (M10+), and therefore is not available for Atlas free-tier users.

    笔记

    网络对等和专用端点的详细信息超出了本入门课程的范围。

练习 3.01:启用网络访问

在本练习中,您将使用 Atlas web 管理控制台为云中的新数据库启用网络访问。这是允许通过 internet 进行网络连接所必需的。

本练习将指导您完成将自己的 IP 地址添加到访问列表的步骤。因此,您的位置将允许网络访问,并且您可以使用在本地计算机上运行的客户端连接到 MongoDB 数据库。按照以下步骤完成此练习:

  1. 转到http://cloud.mongodb.com 连接到 Atlas 控制台。

  2. Log on to your new MongoDB Atlas web interface using your username and password, which was created when you registered for the Atlas Cloud:

    Figure 3.12: MongoDB Atlas login page

    图 3.12:MongoDB Atlas 登录页面

  3. From the SECURITY menu, click the Network Access tab:

    Figure 3.13: Network Access window

    图 3.13:网络访问窗口

  4. IP 访问列表页签中点击添加 IP 地址

  5. From the Add IP Access List Entry window that appears, click the ADD CURRENT IP ADDRESS button:

    Figure 3.14: IP Access list window

    图 3.14:IP 访问列表窗口

    MongoDB web 界面将自动检测您的外部 IP 地址,并将其反映在IP 访问列表条目字段中。

  6. Type This is my IP Address in the Comment field (this is optional):

    Figure 3.15: Typing in a comment in the Add IP Access List Entry window

    图 3.15:在添加 IP 访问列表条目窗口中键入注释

  7. 点击确认按钮保存新条目。Atlas 正在向云系统部署新的 IP 访问列表规则

  8. The IP address will appear in the access list table (as active):

    Figure 3.16: Network Access window

图 3.16:网络访问窗口

笔记

例如,IP100.100.10.10/32是一个虚拟 IP 地址。在您的实际情况中,IP 地址将是您自己的公共 IP 地址,这是不同的。此外,您的 ISP(Internet 服务提供商)可能会为您分配一个动态 IP 地址,该地址不是永久的,并且可能会在一段时间后更改。

我们已经成功地将我们当前的公共 IP 地址“列入”Atlas 云控制台中,以便允许从我们的公共 IP 地址进行 TCP/IP 连接。如果您有多个位置,例如家庭和工作办公室,请在 Atlas 控制台的访问列表中添加多个 IP 地址。

数据库访问

部署在 Atlas 云上的 MongoDB 数据库默认启用了几个安全功能,例如用户访问控制。数据库访问控制验证用户身份验证凭据,例如用户名和密码。因此,即使可以从任何地方访问网络,您仍然需要在成功连接到云中的 MongoDB 数据库之前进行身份验证。这对于保护部署在云中的数据库免受互联网上未经授权的访问是必要的。更重要的是,与其他安全功能相比,云数据库的访问控制不能被禁用,并且将始终保持启用状态。

数据库访问包括数据库安全的以下方面:

  • 数据库用户
  • 数据库角色

与其他 MongoDB 安装相比,Atlas 云中的用户帐户管理是在项目级别配置的。在一个 Atlas 项目中创建的用户在该项目中创建的所有 MongoDB 数据库集群中共享。本章介绍了配置 Atlas 数据库安全性(用户和角色)的基本方法。

笔记

数据库访问仅指对 Atlas 中部署的数据库服务的访问,而不是对 Atlas 控制台本身的访问。作为 Atlas 项目的所有者,您将始终能够连接到 Atlas web 控制台来管理您的云数据库访问。如果您需要向 Atlas 项目添加更多项目团队成员,则可以从 Atlas web 应用程序上的项目选项卡进行添加。在本课程的范围内,当作为 Atlas 项目所有者连接时,这些示例是相关的。

用户认证

用户身份验证是数据库安全的一个重要方面,是保护数据完整性和机密性所必需的。这正是 Atlas 云中部署的所有 MongoDB 数据库要求用户在创建新数据库会话之前进行身份验证的原因。因此,只有受信任的数据库用户才被授予访问云数据库的权限。

数据库身份验证过程包括在连接之前验证用户身份的过程。

用户标识必须限定以下两个参数:

  • 连接时必须提供有效的用户名。
  • 必须通过验证确认用户的身份。

声明有效的用户名很简单。唯一的先决条件是用户名必须存在,这意味着用户名必须是以前创建的,并且必须激活其帐户。

用户名存储

用户需要在 Atlas 中声明才能使用。用户名和密码可以存储在内部(数据库内)或外部(数据库外),如下所示:

  • 内部:用户名存储在 MongoDB 数据库中,在管理员数据库的特殊集合中。有一些限制。管理员数据库只能由系统管理员访问。当用户尝试连接时,用户名必须存在于管理数据库中的现有用户名列表中。

  • Externally: The username is stored in an external system, such as Lightweight Directory Access Protocol (LDAP). For example, the Microsoft Active Directory is an LDAP directory implementation that can be configured for MongoDB username authentication.

    笔记

    LDAP 身份验证仅适用于较大的 Atlas 群集(M10+),并允许对许多数据库用户的帐户进行特定于企业的配置。本入门课程不介绍此配置。

用户名认证

身份验证是验证用户身份的过程。如果用户身份验证成功,则确认并信任用户访问数据库。否则,用户将被拒绝,不允许建立数据库连接。以下是一些身份验证机制,每种机制具有不同的技术和安全级别。

密码认证

  • 简单的密码验证。用户需要提供正确的密码。数据库系统根据声明的用户名验证密码。通过互联网安全验证用户密码的过程称为握手质询响应
  • 密码由 MongoDB 数据库验证。在 LDAP 身份验证的情况下,密码在外部进行验证。自版本 4.0 以来,MongoDB 有了一种新的质询响应方法来验证密码,称为盐渍质询响应认证机制紧急停堆。紧急停堆保证用户密码可以通过互联网安全验证,而无需以明文形式传输或存储密码。这是因为通过互联网的公共基础设施传输明文密码被认为是极不安全的。
  • 在旧版本的 MongoDB 中,使用了不同的质询-响应方法。如果将应用程序从 MongoDB 2.0 或 3.0 升级到最新版本,请验证 MongoDB 客户端与 MongoDB 4.0 或更高版本的兼容性。在撰写本文时,MongoDB 服务器的当前本地版本是 4.4 版。

X.509 证书认证

  • 这是指使用加密证书进行用户身份验证,而不是简单的密码。证书比密码更长更安全。
  • X.509 证书是使用加密标准公钥基础设施PKI创建的数字加密密钥。证书是在一对密钥(公共-私有)中创建的。
  • 此方法还允许用户进行无密码身份验证,这允许用户和应用程序使用私钥 X.509 证书进行连接。

在 Atlas 中配置认证

建议仅使用 Atlas web 应用程序来创建和配置数据库用户。

Atlas 项目所有者可以向 Atlas 项目添加用户,并从 Atlas web 界面配置用户身份验证。Atlas 用户可以添加到各自 Atlas 项目内的所有数据库集群中。通过从 Atlas 应用程序中单击数据库访问可以进行身份验证设置。

以下是 Atlas web 应用程序(的屏幕截图 http://cloud.mongodb.com

Figure 3.17: Database Access window

图 3.17:数据库访问窗口

图 3.17中,您会注意到两个选项卡,数据库用户自定义角色。让我们首先关注数据库用户的可用选项。单击添加新数据库用户选项创建新用户后,将出现以下窗口:

Figure 3.18: Add New Database User window

图 3.18:添加新数据库用户窗口

笔记

密码紧急停堆认证是 Atlas M0 自由层集群的唯一可用选项,本课程将以其为例。其他身份验证方法选项(证书和 AWS IAM)可用于较大的 Atlas M10+群集。

窗口中有两个字段,如图 3.19所示:

Figure 3.19: Username and password fields in the Add New Database User window

图 3.19:添加新数据库用户窗口中的用户名和密码字段

在第一个字段中,您可以键入新的数据库用户名。用户名不应包含空格或特殊字符。只允许使用 ASCII 字母、数字、连字符和下划线。

第二个字段是用户密码。管理员可以手动输入密码,也可以由 Atlas 应用程序生成密码。自动生成安全密码按钮自动生成一个安全、复杂的密码。显示隐藏选项将在屏幕上显示或隐藏密码输入。还可以通过点击复制按钮将密码复制到剪贴板,如图 3.19所示。

临时用户

Atlas 管理员可以决定添加临时用户帐户。临时用户帐户是仅在有限期限内有效的帐户。账户到期后,Atlas 将自动删除该账户:

Figure 3.20: Temporary User option in the Add New User window

图 3.20:添加新用户窗口中的临时用户选项

在上例中,用户帐户my_user设置为在 1 天(24 小时)内自动过期。选中的另存为临时用户复选框,并设置规定的时间。

笔记

内置角色或权限下拉菜单中,管理员可以在创建新用户时分配数据库权限。默认情况下,分配的权限为读写任何数据库。下一节将详细解释数据库特权选项。

添加用户按钮完成添加新用户流程。用户账号创建后,会出现在 MongoDB 用户列表中,如图 3.21所示。如果需要,可以更改或删除用户帐户。使用操作选项卡中的编辑删除选项,可以更改或删除用户帐户详细信息:

Figure 3.21: The Database Access window

图 3.21:数据库访问窗口

笔记

如您所见,在我的图 3.21中的示例中,我的用户帐户设置为 24 小时后自动过期(23:57)。用户帐户将在过期后自动删除。

数据库权限和角色

数据库授权是数据库安全性的一部分,包括 MongoDB 数据库的权限和角色。成功验证用户身份并创建新的数据库会话后,数据库权限和角色将分配给该用户。根据分配给用户的数据库权限验证数据库集合和对象的可访问性。

特权(或操作)是在 MongoDB 数据库中对特定数据库资源执行特定操作的权利。例如,读取权限授予查询特定数据库集合或视图的权限。

可以在一个角色中对多个数据库权限进行分组。有一个很长的数据库特权列表,每个数据库特权对应于 MongoDB 中的不同函数。将权限分配给角色,然后将这些角色分配给用户,而不是直接将权限分配给用户。因此,数据库中权限和角色的管理更容易理解:

Figure 3.22: Pictorial representation of database privileges

图 3.22:数据库权限的图形表示

角色可以具有全局或局部作用域:

  • 全局:此角色适用于所有 MongoDB 数据库和集合。
  • 数据库:此角色仅适用于特定的数据库名称。
  • 集合:此角色仅适用于数据库中的特定集合名称。它具有最严格的范围。

预定义角色

有几个预定义的数据库角色,每个角色都有一个指定的特定权限列表。例如,管理员角色包含管理 MongoDB 数据库所需的所有特权。分配预定义角色是管理 MongoDB 数据库最常用的方法。

如果预定义的角色都不符合应用程序的安全要求,则可以在 MongoDB 中定义自定义角色。以下角色在 Atlas 应用程序中预定义,并可在创建新数据库用户时分配:

  • Atlas admin: This has all the permissions and roles necessary for MongoDB database administration in the cloud. The role is global, applicable to all database clusters created in one project Atlas account. It includes many database roles, such as dbAdminAnyDatabase, readWriteAnyDatabase, and clusterMonitor.

    笔记

    Atlas admin角色与 MongoDB 数据库dbAdmin角色不同。Atlas admin角色包括dbAdmin以及其他角色,仅在 Atlas 云平台上可用。

  • 对任意数据库的读写:该 Atlas 角色具有对任意数据库角色的读写权限,适用于一个 Atlas 项目账户内创建的所有数据库集群。

  • 只读取任何数据库:这是一个只读 Atlas 角色,适用于在一个 Atlas 项目帐户内创建的所有数据库集群。

在 Atlas 中配置内置角色

分配内置角色的最简单方法是在创建新用户时。Atlas 提供了一个非常简单直观的界面来添加新的数据库用户。创建新用户时,会分配默认的内置角色或权限。但是,管理员可以为新用户分配不同的角色,也可以编辑现有用户的权限。

笔记

强烈建议仅使用 Atlas web 界面来管理数据库角色和权限。Atlas 将自动禁用并回滚未通过 Atlas web 界面对数据库角色所做的任何更改。

Atlas 中的用户角色可以在**+添加新用户窗口或编辑**用户窗口中进行管理,如前一节所述:

Figure 3.23: Add New Database User window

图 3.23:添加新数据库用户窗口

默认情况下,窗口中会自动选择内置的读写任意数据库角色,如图 3.23所示。但是,管理员可以通过点击下拉菜单来分配不同的角色(例如,Atlas admin,如图 3.24所示:

Figure 3.24: Selecting a role in the Add New User window

图 3.24:在添加新用户窗口中选择角色

高级特权

有时,内置的 Atlas 数据库角色都不适合访问数据库。在某些情况下,预期的数据库设计需要特殊的用户访问权限,或者应用程序需要实现特定的安全策略。

笔记

本章后面介绍的自定义角色提供了比高级权限更好的功能。始终建议创建自定义角色并为角色分配个人权限,而不是直接为用户分配特定权限。

如果在下拉列表中选择授予特定权限,则界面会发生变化:

Figure 3.25: Granting specific privileges in the Add New User window

图 3.25:在添加新用户窗口中授予特定权限

图 3.25所示,管理员可以快速为用户分配特定的 MongoDB 权限。此高级功能将在本章后面的自定义角色中介绍。现在,让我们在下面的练习中配置数据库访问。

练习 3.02:配置数据库访问

本练习的目标是为新的 MongoDB 数据库启用数据库访问。您的数据库现在允许连接,并要求进行用户名和密码验证。为了启用访问,您需要创建一个新用户并授予相应的数据库访问权限。

创建一个用户名为admindb的管理员用户。

按照以下步骤完成此练习:

  1. 重复练习 3.01**启用网络访问中的123步骤,登录新的 MongoDB Atlas web 界面并选择项目 0

  2. From the SECURITY menu, select the Database Access option:

    Figure 3.26: Selecting the Database Access option

    图 3.26:选择数据库访问选项

  3. 数据库用户页签中点击添加新数据库用户,即可添加新的数据库用户。此时会打开添加新用户窗口。

  4. 保留默认认证方式密码

  5. 提供用户名或键入admindb作为用户名。

  6. Provide the password or click Autogenerate Secure Password to generate the password. Click SHOW to see the autogenerated password:

    Figure 3.27: Add New Database User window

    图 3.27:添加新数据库用户窗口

  7. 点击数据库用户权限下的下拉菜单,选择阿特拉斯管理员角色。

  8. Click Add User. The system will apply the changes to the databases:

    Figure 3.28: New admin user details

图 3.28:新管理员用户详细信息

图 3.28中,您可以看到紧急停堆认证方式MongoDB 角色(全局)设置为的新用户admindbatlasAdmin@admin用于本项目所有数据库。

新的数据库用户现在已在 Atlas 中配置和部署。

配置自定义角色

顾名思义,自定义角色是未包含在任何内置 Atlas 数据库角色中的选定数据库权限的集合。例如,如果需要读取和更新权限,但没有删除和插入新文档的权限,则需要创建自定义角色,因为此权限组合不是任何内置角色的一部分。

数据库访问窗口中,单击应用程序中的第二个选项卡自定义角色。此选项用于创建和修改自定义 Atlas 角色。

笔记

在将自定义角色分配给用户之前,需要在 Atlas 中定义自定义角色。

点击新增自定义角色按钮,可新建自定义角色。此时会出现新的自定义角色窗口:

Figure 3.29: MongoDB custom roles

图 3.29:MongoDB 自定义角色

可以根据以下类别选择操作:

  • 采集操作:适用于采集数据库对象的操作
  • 数据库操作:适用于数据库的操作
  • 全球行动:全球适用于所有 Atlas 项目的行动

例如,数据库管理员只允许用户更新数据库集合。用户无法在集合中删除或插入新文档。任何 Atlas 预定义角色中都不包含此特定操作组合。

在一个复杂角色下定义的集合/数据库/全局操作可能有多种组合。定义完成后,点击添加自定义角色按钮,在 Atlas 中创建新角色。新角色在列表中可见,如图 3.30所示:

Figure 3.30: Custom role list

图 3.30:自定义角色列表

笔记

创建自定义角色后,它们将在 Atlas 中可见,并可以分配给数据库用户。可以从添加/编辑用户窗口,在数据库权限下拉列表中,在下选择预定义的自定义角色来分配新的自定义角色。

数据库客户端

在介绍 MongoDB 数据库的不同类型的客户机的细节之前,让我们先看一个简短的介绍,以澄清数据库客户机的基础知识。数据库客户端是一种软件应用程序,旨在执行以下操作:

  • 连接到 MongoDB 数据库服务器
  • 从数据库服务器请求信息
  • 通过发送 MongoDB CRUD 请求修改数据
  • 向数据库服务器发送其他数据库命令

与 MongoDB 数据库服务器的交互和兼容性至关重要。客户机和服务器之间的兼容性差异例如,不同的版本可能会产生意外的结果或产生数据库或应用程序错误。这就是为什么客户机通常要测试和认证与特定版本的 MongoDB 数据库的兼容性。

让我们根据创建 MongoDB 客户端的目的对其进行分类:

  • 基础:这是一个极简版的客户端。基本客户机通常与数据库软件一起提供,它提供一个与数据库服务器一起工作的交互式应用程序。
  • 面向数据的:这种类型的客户端设计用于处理数据。它通常提供一个图形用户界面GUI),以及帮助您高效查询、聚合和修改数据的工具。
  • 驱动程序:用于提供 MongoDB 数据库与其他软件系统(如通用编程语言)之间的接口。驱动程序主要用于软件开发和应用程序部署。

现在,您已经为部署在 Atlas 云中的新 MongoDB 数据库完成了所有配置更改。前面的章节已经介绍了在本地计算机上安装 MongoDB 客户端。如有必要,查看第一章MongoDB 简介,了解 MongoDB 的基本安装。下一步是使用本地 MongoDB 客户端连接到云中的新数据库。其次,数据迁移将使用 Python 脚本的自定义集合,因此您需要知道如何从 Python 连接到 Atlas 中的 MongoDB 数据库。下一节将讨论 MongoDB 中有关客户端连接的所有方面。

连接串

连接字符串到底是什么?为什么它很重要?连接字符串只不过是标识数据库服务地址及其参数的方法,以便客户端可以通过网络连接到服务器。这一点很重要,因为如果没有连接字符串,客户端将不知道如何连接到数据库服务。

数据库客户端(如用户和应用程序)需要形成有效的连接字符串,以便能够连接到数据库服务。此外,MongoDB 连接字符串遵循统一资源标识符URI格式)将所有连接细节传递给数据库客户端。

以下是 MongoDB 连接字符串的一般格式:MongoDB+srv://user:pass@主机名:端口/数据库名称?选项

下表描述了连接字符串的元素:

Figure 3.31: Elements of the connection string

图 3.31:连接字符串的元素

笔记

有关新前缀mongodb+srv以及如何使用 DNS srv 记录识别 mongodb 服务的更多详细信息,将在第 10 章复制中介绍。

现在让我们看一些连接字符串的示例,如下所示:

蒙哥达+srv://guest:passwd123@atlas1-u7xxx.mongodb.net:27017/data1

此连接字符串适用于尝试使用以下参数进行数据库连接:

  • 服务器在 Atlas 云上运行(主机名为mongodb.net
  • 数据库集群名称为atlas1
  • 尝试使用用户名guest和密码passwd123进行连接。
  • 数据库服务在标准 TCP 端口27017上提供。
  • 服务器上的默认数据库名称为data1

虽然前面的连接字符串对 Atlas 数据库连接有效,但在连接字符串中显示密码通常不是一个好主意。以下是在连接时请求密码的示例:

蒙哥达+srv://guest@atlas1-u7xxx.mongodb.net:27017/data1

另一个例子如下:

蒙哥达+srv://atlas1-u7xxx.mongodb.net:27017/data1 --用户名来宾

在这种情况下,尝试使用来宾用户名进行连接。但是,密码不是连接字符串的一部分,服务器将在连接时请求密码。

如果数据库名称被省略(或无效),将尝试连接到默认数据库,即管理数据库。此外,如果省略 TCP 端口,它将尝试连接到默认 TCP 端口 27017,如下例所示:

蒙哥达+srv://guest@atlas1-u7xxx.mongodb.net

对于非云数据库连接或传统 MongoDB 连接,应使用简单的MongoDB前缀。以下是一些非云连接字符串的示例:

mongodb://localhost/data1

在本例中,主机名为localhost,这意味着数据库服务器与应用程序运行在同一台计算机上,并尝试连接到数据库data1。以下是非默认 TCP 端口5500上远程网络连接的另一个示例:

mongodb://devsrv01.dev-domain-example.com:5500/data1

由于连接字符串中未指定用户名,因此尝试在没有用户名的情况下进行连接。这种类型的连接适用于没有授权模式(未配置用户安全)的数据库。始终为云数据库配置授权模式。

笔记

如果在复制或分片集群中配置数据库服务,则 MongoDB 连接字符串可能不同。MongoDB 集群的连接字符串示例将在后面的第 10 章复制中提供。

蒙戈贝壳

连接到 MongoDB 数据库的最简单方法可能是使用 MongoShell。mongo shell 为 MongoDB 数据库提供了一个简单的终端模式客户端:

  • MongoShell 包含在所有 MongoDB 安装中。
  • 它可用于在终端模式下运行服务器交互命令。
  • 它可以用来运行 JavaScript。
  • mongo shell 有自己的命令。

要启动 mongo shell,请在命令提示符下运行mongo命令,如下所示:

C:\>mongo --help
MongoDB shell version v4.4.0
usage: mongo [options] [db address] [file names (ending in .js)]
db address can be:
  foo                   foo database on local machine
  192.168.0.5/foo       foo database on 192.168.0.5 machine
  192.168.0.5:9999/foo  foo database on 192.168.0.5 machine on port 9999
  mongodb://192.168.0.5:9999/foo  connection string URI can also be used
Options:
  --ipv6                               enable IPv6 support (disabled by
....

练习 3.03:使用 Mongo Shell 连接云数据库

这个简单的练习将向您展示使用 mongo shell 连接 Atlas 的步骤。对于本练习,请在连接字符串中使用mongodb+srv前缀。第一步是获取 Atlas 云数据库的群集名称(DNS SRV 记录):

  1. Log on to your new MongoDB Atlas web interface using your username and password, which was created when you registered for the Atlas Cloud:

    Figure 3.32: MongoDB Atlas login page

    图 3.32:MongoDB Atlas 登录页面

  2. 点击图集项目菜单中的集群页签,如图 3.33所示。

  3. Click on the CONNECT button in the Clusters menu. In the case of M0 free-tier, there is a single cluster called Cluster0:

    Figure 3.33: Clusters window

    图 3.33:集群窗口

  4. The Connect to Cluster0 window appears:

    Figure 3.34: Connect to Cluster0 window

    图 3.34:连接到 Cluster0 窗口

  5. Click Connect with the mongo shell. The following window appears:

    Figure 3.35: Connect to Cluster0 page

    图 3.35:连接到 Cluster0 页面

  6. 选择我已安装 mongo shell选项,并选择正确的 mongo shell 版本(撰写本文时最新的 mongo shell 版本为 4.4)。或者,您可以选择我没有安装 mongo shell并安装 mongo shell(如果您还没有安装)。

  7. 点击复制将连接字符串复制到剪贴板。

  8. 在操作系统中启动命令提示符窗口或终端。

  9. Start the mongo shell with the new connection string command line:

    C:\>mongo "mongodb+srv://cluster0.u7n6b.mongodb.net/test" --username admindb

    将显示以下详细信息:

    MongoDB shell version v4.4.0
    Enter password:
    connecting to: mongodb://cluster0-shard-00-00.u7n6b.mongodb.net:27017,cluster0-
    Implicit session: session { "id" : UUID("7407ce65-d9b6-4d92-87b2-754a844ae0e7") }
    MongoDB server version: 4.2.8
    WARNING: shell and server versions do not match
    MongoDB Enterprise atlas-rzhbg7-shard-0:PRIMARY>

    要以练习 3.02配置数据库访问中创建的admindb数据库用户身份连接到 Atlas 数据库,当出现提示时,为admindb用户提供密码并完成连接。

    成功建立连接后,shell 提示符将显示以下详细信息:

    MongoDB Enterprise atlas-rzhbg7-shard-0:PRIMARY>

    详情如下:

    • 企业版:指 MongoDB 企业版。

    • atlas1-####-shard-0:指 MongoDB 副本集名称。我们将在稍后更详细地了解这一点。

    • PRIMARY>: This refers to the state of the MongoDB instance, which is PRIMARY.

      笔记

      您可能会看到一条消息说警告:shell 和服务器版本不匹配。这是因为 mongo shell 的最新版本是 4.4,而 M0 Atlas 云数据库的版本是 4.2.8。此警告可以忽略。

  10. 键入退出退出 mongo 外壳。

在本练习中,您使用 mongo shell 客户端连接到云数据库。为了方便起见,您使用 Atlas 接口复制 Atlas 集群的连接字符串。实际上,开发人员已经提前准备好了数据库连接字符串,所以他们不需要每次连接到数据库时都从 Atlas 应用程序复制它。

蒙哥达罗盘

MongoDB Compass 是 MongoDB 中用于数据可视化的图形化工具。它与 MongoDB 服务器安装一起安装,因为 MongoDB Compass 是标准发行版的一部分。或者,可以单独下载和安装 MongoDB Compass,而无需使用 MongoDB 服务器软件。

MongoDB Compass 简单而强大的 GUI 界面帮助您轻松查询和分析数据库中的数据。MongoDB Compass 有一个查询生成器图形界面,大大简化了创建复杂 JSON 数据库查询的工作。

MongoDB Compass 1.23 版如以下屏幕截图所示:

Figure 3.36: MongoDB Compass connected to Atlas cloud

图 3.36:连接到 Atlas 云的 MongoDB 罗盘

以下是标准版本中最重要的 MongoDB 指南针功能:

  • 轻松管理数据库连接
  • 与数据、查询和 CRUD 的交互
  • 高效的图形查询生成器
  • 查询执行计划的管理
  • 聚合生成器
  • 收集索引的管理
  • 模式分析
  • 实时服务器统计数据

除标准 MongoDB Compass 标准版本外,在编写本章时,还有两个版本的 MongoDB Compass 可供下载:

  • 指南针隔离:用于高度安全的环境。Compass 的独立版本仅向所连接的 MongoDB 服务器发起网络请求。

  • Compass Read Only: As the name suggests, the read only version of Compass does not change any data in the database and it is used only for queries.

    注:

    MongoDB Compass 社区版本现已弃用。相反,您可以使用完整版本的 MongoDB Compass,它可以免费使用,并包括企业版功能,如 MongoDB 模式分析。

MongoDB 驱动程序

有一种误解认为 MongoDB 只是 JavaScript 堆栈的数据库。将 MongoDB 的功能降至最低并仅用于 JavaScript 应用程序是不合适的。

MongoDB 是一个具有灵活数据模型的多平台数据库,可用于任何类型的应用程序。此外,几乎每种编程语言都对 MongoDB 提供了强大的支持。

最有用和最流行的 MongoDB 客户端版本可能由驱动程序表示。MongoDB 驱动程序是数据库和软件开发世界之间的粘合剂。目前,最流行的编程语言有很多驱动程序,如 C/C++、C#、Java、Node 和 Python。

作为软件库接口的驱动程序 API 使在编程语言结构中直接使用 MongoDB 数据库函数成为可能。例如,来自 MongoDB 的特定 BSON 数据类型被转换为可在编程语言(如 Python)中使用的数据格式。

练习 3.04:使用 Python 驱动程序连接 MongoDB 云数据库

业务决策通常是在数据分析的基础上做出的。有时,为了获得有用的结果,开发人员使用诸如 Python 之类的编程语言来分析数据。Python 是一种功能强大的编程语言,但它很容易学习和实践。在本练习中,您将从 Python 3 连接到 MongoDB 数据库。在使用 Python 连接 MongoDB 之前,请注意以下几点:

  • 为了使用 Python 进行连接,您不需要在计算机上本地安装 MongoDB。
  • Python 库使用pymongo模块连接到 MongoDB。
  • Python2 和 Python3 都可以使用pymongo模块。然而,由于 Python2 现在已经过时,强烈建议在新的软件开发中使用 Python3。
  • MongoDB 客户端是pymongoPython 库的一部分。
  • 您还需要安装 DNSPython 模块,因为 Atlas 连接字符串是 DNS SRV 记录。因此,需要 DNSPython 模块来执行 DNS 查找。

按照以下步骤完成练习:

  1. Verify that the Python version is 3.6 or higher, as follows:

    # Check Python version  3.6+
    # On Windows
    C:\>python --version
    Python 3.7.3
    # On MacOS or Linux OS
    $ python3 --version

    笔记

    对于 macOS 或 Linux,Python shell 可以以Python 3而不是Python开头。

  2. 在安装pymongo之前,请确保已安装 Python 包管理器pip

    # Check PIP version
    # On Windows
    C:\>pip --version
    pip 19.2.3 from C:\Python\Python37\site-packages\pip (python 3.7)
    # On MacOS and Linux
    $ pip3 --version
  3. 安装pymongo****客户端,如下所示:

    # Install PyMongo client on Windows
    C:\>pip install pymongo
    # Install PyMongo client on MacOS and Linux
    $ pip3 install pymongo
    # Example output (Windows OS)
    C:\>pip install pymongo
    Collecting pymongo
      Downloading https://files.pythonhosted.org/packages/c9/36/715c4ccace03a20cf7e8f15a670f651615744987af62fad8b48bea8f65f9/pymongo-3.9.0-cp37-cp37m-win_amd64.whl (351kB)
         358kB 133kB/s
    Installing collected packages: pymongo
    Successfully installed pymongo-3.9.0
  4. Install the dnspython module, as follows:

    # Install dnspython on Windows OS
    C:\> pip install dnspython
    # Install dnspython on MacOS and Linux
    $ pip3 install dnspython
    # Example output (Windows OS)
    C:\> pip install dnspython
    Collecting dnspython
      Using cached https://files.pythonhosted.org/packages/ec/d3/3aa0e7213ef72b8585747aa0e271a9523e713813b9a20177ebe1e939deb0/dnspython-1.16.0-py2.py3-none-any.whl
    Installing collected packages: dnspython
    Successfully installed dnspython-1.16.0

    现在您已经准备好了 Python 环境,下一步是为您的云数据库获取正确的连接字符串。测试 MongoDB 连接以确认这一点。

  5. 编辑连接字符串并添加数据库名称和密码。尝试使用在练习 3.02配置数据库访问

    mongodb+srv://admindb:<password>@<server_link>/<database_name>

    中创建的admindb用户名进行连接

  6. Replace <server_link> with your server link.

    笔记

    例如,考虑这种情况下,连接字符串如下:

    “mongodb+srv://admindb:xxxxxx@cluster0-u7xxx.mongodb.net/test?retryWrites=true&w=多数“

    在这里,服务器链接可以快速识别为:cluster0-u7xxx.mongodb.net

  7. 将**<数据库>替换为您的数据库名称,在本例中为样本**。

  8. Replace with the admindb user password.

    笔记

    如果您想与其他用户连接,而非admindb-将admindb替换为您的用户名,将**<密码>**替换为您的密码。

  9. Edit a test script in Python to test your connection and execute the Python script. In Windows, open the Notepad text editor and type in the following Python code:

    # Python 3 script to test MongoDB connection
    # MongoDB Atlas connection string needs to be edited with your connection
    from pymongo import MongoClient
    uri="mongodb+srv://admindb:xxxxxx@cluster0-u7xxx.mongodb.net/test?retryWrites=true&w=majority"
    client = MongoClient(uri)
    # switch to mflix database
    mflix = client['sample_mflix']
    # list collection names
    print('Mflix Collections: ')
    for name in mflix.list_collection_names(): 
      print(name)

    注:

    不要忘记用 Atlas 连接详细信息更新 URI。如果使用本例中提供的 URI,则会收到连接错误。

  10. 使用名称mongo4_atlas.py保存文本脚本-例如,在C:\Temp\mongo4_atlas.py中。

  11. Run the test script.

在 Windows 的命令提示符下,键入:

```js
"python C:\Temp\mongo4_atlas.py"
```

在 macOS/Linux shell 提示符中,键入:

```js
"$ python3 ./mongo4_atlas.py " 
```

脚本的输出将显示数据库中的集合,如下所示:

```js
C:\>python C:\Temp\mongo4_atlas.py 
Mflix Collections: 
comments
users
theaters
sessions
movies
>>>
```

在本练习中,您实际使用编程语言(如 Python)在云中使用 MongoDB。使用扩展 Python 库的可能性是无限的;您可以创建 web 应用程序、执行数据分析等。

服务器命令

MongoDB 是一种数据库服务器,其客户端通过网络连接到服务器。数据库服务器管理数据库,而应用程序或用户使用客户端从数据库查询数据。如果您想知道是否只有数据库(没有服务器),那么是的,有。例如,MicrosoftAccess 是一个没有数据库服务器的关系数据库示例。客户机-服务器体系结构的主要优点是,服务器整合了控制数据管理、用户安全性和并行访问的并发性。

还有物理结构和逻辑结构的分离。数据库服务器管理数据库的物理结构,如存储和内存。另一方面,数据库客户端通常只能访问逻辑数据库结构,如集合、索引和视图。

本节将简要解释 MongoDB 4.4 中的物理和逻辑结构。

物理结构

数据库的物理结构由分配给 MongoDB 服务器的计算资源组成,如处理器线程、内存分配和数据库文件存储。计算需求和调优是数据库管理的重要组成部分,特别是对于本地数据库服务器。然而,对于部署在 MongoDB Atlas 云上的数据库,用户看不到数据库的物理结构。数据库由 MongoDB 内部管理。因此,云用户可以专注于数据库利用率和应用程序开发,而不是将时间花在物理资源(如存储和内存)的数据库管理上。

如引言所述,MongoDB Atlas 根据集群层大小分配物理资源。资源管理完全通过 CloudAtlas 应用程序完成。如果需要更多的资源,集群可以扩展到更大的规模。

空闲层 M0 集群没有专用资源(只有共享的 CPU 和内存)。然而,免费的 M0 层集群是一个很棒的数据库集群,因为它总是可以用于学习和测试 MongoDB。

数据库文件

MongoDB 会自动在磁盘上创建多种类型的文件,如数据文件和日志文件。对于 Atlas 云数据库,所有数据库文件都由 MongoDB 内部管理:

  • **数据文件:**这些文件用于数据库集合和其他数据库对象。MongoDB 有一个可配置的数据文件存储引擎,WiredTiger 是一个高性能的存储引擎,它从 3.0 版开始引入 MongoDB。
  • **Oplog:这些文件用于集群成员之间的事务复制。我们将在*第 10 章复制中详细了解这些。*
  • **其他文件:**配置文件、数据库日志、审计文件等文件。

数据库度量

虽然数据文件和内存管理不是部署在云中的数据库的主题,但有必要监控分配的云资源的利用率。Atlas 资源监控提供了一个显示性能指标的图形界面。Atlas 中有许多可用的指标,如逻辑数据库指标、物理数据库指标和网络带宽。

本主题的内容超出了本书的范围。有关更多详细信息,请参阅 MongoDB Atlas 文档,监控和警报https://docs.atlas.mongodb.com/monitoring-alerts/ )。

逻辑结构

数据库的逻辑结构由数据库、集合和其他数据库对象组成。下图显示了 MongoDB 的主要逻辑结构:

Figure 3.37: Logical structure of MongoDB

图 3.37:MongoDB 的逻辑结构

**MongoDB 服务器:**运行 MongoDB 服务器实例的物理或虚拟计算机。对于 MongoDB 集群,当客户端连接到 MongoDB 时,会有一组少量的 MongoDB 实例

**数据库:**MongoDB 集群包含多个数据库。每个数据库都是 MongoDB 中数据库对象的逻辑存储容器。有一些系统数据库是在部署数据库时创建的。系统数据库由 MongoDB 服务器在内部用于数据库配置和安全,不能用于用户数据。

**对象:**数据库包含以下对象:

  • JSON 文档集合
  • 索引
  • 意见

MongoDB 中的基本逻辑实体是 JSON 文档。多个文档在一个集合中分组,多个集合在一个数据库中分组。在 MongoDB 版本 4 中,引入了更多的对象,例如数据库视图,它们为数据库添加了更多功能。在练习 3.05**创建数据库视图对象中,我们将通过一个合适的示例了解数据库视图对象。

服务器命令

在客户机-服务器-数据库-服务器体系结构(如 MongoDB 服务器)中,客户机向数据库服务器发送请求,MongoDB 服务器在服务器端执行请求。因此,当服务器执行客户机请求时,不涉及客户机处理。请求完成后,服务器将执行结果或消息发送回客户端。

虽然 MongoDB 服务器有很多功能,但有几个不同的类别:

  • CRUD 操作:数据库创建、读取、更新、删除CRUD操作是修改数据文档的命令。
  • 数据库命令:这些都是与数据查询和 CRUD 操作不同的命令。数据库命令还有其他功能,如数据库管理、安全性和复制。

每次用户更改数据库配置时,Atlas 都会在后台执行大多数数据库命令。例如,当 Atlas 项目所有者添加新用户时,Atlas 应用程序在后台运行数据库命令,以在数据库中创建用户。不过,也可以从 MongoDB Shell 或 MongoDB 驱动程序执行服务器命令。

通常,运行数据库命令的语法如下所示:

>>> db.runCommand( { <db_command> } )

db_ 命令为数据库命令。

例如,如果要检索 MongoDB 中正在执行的当前操作,可以使用以下语法运行命令:

>>> db.runCommand( {currentOp: 1} )

服务器将返回一个 JSON 格式的文档,其中包含正在进行的操作。

一些数据库命令有自己较短的语法,可以在没有通用的db.runCommand语法的情况下运行。这是为了方便记忆更常用命令的语法。例如,用于列出当前数据库中所有集合的命令的语法为:

>>> db.getCollectionNames()

对于部署在 Atlas 云中的数据库,有些数据库管理命令无法直接从 mongo shell 执行。完整的命令列表可在 MongoDB Atlas 文档中找到,M0/M2/M5 集群中不支持的命令 https://docs.atlas.mongodb.com/reference/unsupported-commands/ )。

练习 3.05:创建数据库视图对象

在本练习中,您将练习数据库命令。本练习的目标是从 mongo shell 终端创建一个新的数据库对象。您将创建一个数据库视图对象,以仅显示三列:电影名称、发行年份和收藏信息。您将使用 MongoDB 控制台执行所有数据库命令。

以下是执行此练习的步骤:

  1. 使用 MongoDB 控制台的连接字符串连接到 Atlas 数据库。重复练习 3.03**中的步骤 1 至 9*,使用 Mongo Shell连接云数据库,使用 Mongo Shell 客户端进行连接。如果您已经为 Atlas 数据库准备好了连接字符串,请启动 mongo shell 并按照练习 3.03步骤 8*的说明进行连接,使用 mongo shell连接到云数据库。

  2. 使用使用数据库命令

    >>> use sample_mflix

    选择mflix电影数据库

  3. 使用getCollectionNames数据库命令列出现有集合,以返回当前数据库中所有集合的列表:

    >>> db.getCollectionNames()
  4. Create a short_movie_info view from the movies collection:

    db.createView(
       "short_movie_info",
       "movies",
       [ { $project: { "year": 1, "title":1, "plot":1}}]
    )

    笔记

    $项目操作符仅用于从电影集合中选择三个字段(标题情节

  5. Execute the createView code:

    MongoDB Enterprise Cluster0-shard-0:PRIMARY> db.createView(
    ...    "short_movie_info",
    ...    "movies",
    ...    [ { $project: { "year": 1, "title":1, "plot":1}}]
    ... )

    响应**“ok”:1**表示创建和查看数据库的命令已成功执行,没有错误,如下代码输出:

    # Command Output
    {
            "ok" : 1,
            "operationTime" : Timestamp(1569982200, 1),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1569982200, 1),
                    "signature" : {
                            "hash" : BinData(0,"brozBUoH099xryq5l439woGcL3o="),
                            "keyId" : NumberLong("6728292437866840066")
                    }
            }
    }

    笔记

    输出详细信息可能因服务器运行时值而异。

  6. Verify that the view was created. The view just shows as a collection:

    >>> db.getCollectionNames()

    此命令返回集合列表中具有视图名称的数组。

  7. Query the view, as follows:

    >>> db.short_movie_info.findOne()

    视图数据库对象的行为与普通集合完全相同。可以使用与查询数据库集合相同的方式查询视图。您将运行一个简短的查询以仅返回一个文档。

    此查询的输出将仅显示文档id地块年份标题。完整的会话输出如下所示:

    Figure 3.38: Session output

图 3.38:会话输出

这是一个如何创建新数据库对象(例如简单视图)的示例。视图对于用户和开发人员加入多个集合以及限制 JSON 文档中某些字段的可见性非常有用。一旦我们进一步了解了 MongoDB 查询和聚合,我们就可以应用所有这些技术在数据库中创建更复杂的视图,从多个集合到使用聚合管道。

活动 3.01:管理您的数据库用户

假设您负责管理公司的 MongoDB 数据库,该数据库位于亚马逊网络服务AWS中的 MongoDB Atlas 云基础设施中。最近,您被告知新的开发人员 Mark 已加入团队。作为一名新的团队成员,Mark 需要访问新项目的 MongoDB 电影数据库。

执行以下高级步骤以完成活动:

  1. 创建一个名为dev_mflix的新数据库,用于开发。
  2. 为开发者创建一个新的自定义角色,名为开发者
  3. dev_mflix数据库的读写权限授予开发者角色。
  4. 开发者角色授予示例电影电影数据库的只读权限。
  5. 为 Mark 创建新的数据库帐户。
  6. 授予开发者自定义角色进行标记。
  7. 通过连接到标记为用户的数据库来验证帐户,并验证访问权限。

Mark 不能修改制作电影数据库,也不能在服务器上看到除sample_mflixdev_mflix之外的任何其他数据库。

一旦 Mark 成功添加到 Atlas 项目中,您应该能够测试与该帐户的连接。使用以下命令连接 mongo shell:

C:\> mongo "mongodb+srv://cluster0.u7n##.mongodb.net/admin" --username Mark

笔记

您的实际连接字符串不同,需要从 Atlas connect 窗口复制,如本章所述。

这是输出终端的一个示例(来自 mongo 外壳):

Figure 3.39: Connecting the MongoDB Shell

图 3.39:连接 MongoDB 外壳

笔记

此活动的解决方案可通过此链接找到

总结

在本章中,您学习了 Atlas 服务管理的基础知识。由于安全性是云计算的一个非常重要的方面,因此控制网络访问和数据库访问对于 Atlas 平台至关重要,您现在应该能够设置新用户并授予数据库资源的权限。还详细研究了数据库连接和 MongoDB 数据库命令。下一章将向您介绍 MongoDB 查询语法。MongoDB NoSQL 语言是一种功能丰富的数据库语言,与所有编程语言都集成得很好。