

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon DocumentDB（兼容 MongoDB）是什么
<a name="what-is"></a>

Amazon DocumentDB（与 MongoDB 兼容） 是一种快速、可靠、完全托管的数据库服务。Amazon DocumentDB 可在云中轻松设置、操作和扩展与 MongoDB 兼容的数据库。借助 Amazon DocumentDB，您可以运行与 MongoDB 相同的应用程序代码，并使用与 MongoDB 相同的驱动程序和工具。

在使用 Amazon DocumentDB 之前，您应查看 [工作原理](how-it-works.md) 中所述的概念和功能。之后，完成 [入门指南](get-started-guide.md) 中的步骤。

**Topics**
+ [概述](#overview)
+ [集群](#what-is-db-clusters)
+ [实例](#what-is-db-instances)
+ [地区和 AZs](#what-is-regions-and-azs)
+ [定价](#docdb-pricing)
+ [监控](#what-is-monitoring)
+ [接口](#what-is-interfaces)
+ [接下来做什么？](#what-is-next)
+ [工作原理](how-it-works.md)
+ [什么是文档数据库？](what-is-document-db.md)

## Amazon DocumentDB 概述
<a name="overview"></a>

以下是 Amazon DocumentDB 的一些高级功能：
+ Amazon DocumentDB 支持两个类型的集群：基于实例的集群和弹性集群。弹性集群支持 reads/writes 每秒数百万和数 PB 存储容量的工作负载。有关弹性集群的更多信息，请参阅 [Amazon DocumentDB 弹性集群](docdb-using-elastic-clusters.md)。以下内容涉及 Amazon DocumentDB 基于实例的集群。
+ Amazon DocumentDB 会随着您的数据库存储需求的增长而自动提高您的存储卷大小。您的存储卷以 10 GB 为增量增加，最大可扩展到 128 TiB。您无需为了满足未来增长需求而为集群预置任何多余存储空间。
+ 借助 Amazon DocumentDB，您可以通过创建多达 15 个副本实例来增加读取吞吐量以支持高容量应用程序请求。Amazon DocumentDB 副本共享相同的底层存储，从而降低成本并且避免在副本节点上执行写入的需要。此功能将释放更多的处理能力来提供读取请求并降低副本延迟时间 通常可降低到几毫秒。无论存储卷大小如何，您都可以在几分钟内添加副本。Amazon DocumentDB 还提供读取器端点，从而无需在添加和删除副本时跟踪副本应用程序即可连接。
+ Amazon DocumentDB 允许您为每个实例增加或减少计算和内存资源。计算扩展操作通常可在几分钟之内完成。
+ Amazon DocumentDB 在 Amazon Virtual Private Cloud（Amazon VPC）中运行，因此您可以在自己的虚拟网络中隔离您的数据库。您还可以配置防火墙设置以控制网络访问集群。
+ Amazon DocumentDB 持续监控集群的运行状况。发生实例故障时，Amazon DocumentDB 自动重启该实例和相关进程。Amazon DocumentDB 不需要数据库重做日志的崩溃恢复重播，这大大缩短重启时间。Amazon DocumentDB 还将数据库缓存与数据库进程隔离，使缓存能够在实例重启后继续运行。
+ 发生实例故障时，Amazon DocumentDB 自动将故障转移到最多 15 个 Amazon DocumentDB 副本中的一个，而这些副本是您在其他可用区中创建的。如果未预配置副本，当发生故障时，Amazon DocumentDB 尝试为您自动创建一个新的 Amazon DocumentDB 实例。
+ Amazon DocumentDB 中的备份功能支持您的集 point-in-time群恢复。此功能允许您将集群恢复到保留期内（最多是近 5 分钟内）任何一秒钟的状态。可将自动备份保留期配置为最长 35 天。自动备份存储在 Amazon Simple Storage Service (Amazon S3) 中，该服务专为 99.999999999% 持久性设计。Amazon DocumentDB 备份是自动、增量和连续的，不影响您的集群性能。
+ 借助 Amazon DocumentDB，您可以使用自己创建和控制的密钥对数据库进行加密 AWS Key Management Service ()AWS KMS。在通过 Amazon DocumentDB 加密运行的数据库集群上，静态存储于底层存储的数据都将加密。在同一个集群中的自动备份、快照和副本也会被加密。
+ Amazon DocumentDB 已获得联邦风险与授权管理计划 (FedRAMP) 的授权。它拥有（美国）地区的 FedRAMP 高级授权， AWS GovCloud 对美国地区有 FedRAMP 中级授权。 AWS East/West 有关合规工作的详细信息 AWS 以及合规工作，请参阅[合规性计划范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/FedRAMP/)。

如果您不熟悉 AWS 服务，请使用以下资源了解更多信息：
+ AWS 为计算、数据库、存储、分析和其他功能提供服务。有关所有 AWS 服务的概述，请参阅[使用 Amazon Web Services 进行云计算](https://aws.amazon.com/what-is-aws/)。
+ AWS 提供了许多数据库服务。有关最适合您环境的服务的指南，请参阅 [AWS上的数据库](https://aws.amazon.com/products/databases/)。

## 集群
<a name="what-is-db-clusters"></a>

一个*集群*包含 0 到 16 个实例和一个管理这些实例的数据的集群存储卷。所有写入操作都通过主实例完成。所有实例（主实例和副本实例）都支持读取。集群的数据存储在集群卷中，副本存储在三个不同的可用区中。

![\[Amazon DocumentDB 集群包含可用区 1 中的主实例，写入可用区 2 和 3 中副本的集群卷。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/how-it-works-01c.png)


Amazon DocumentDB 5.0 基于实例的集群支持数据库集群采用以下两种存储配置：Amazon DocumentDB 标准配置和 Amazon DocumentDB I/O 优化配置。有关更多信息，请参阅 [Amazon DocumentDB 集群存储配置](db-cluster-storage-configs.md)。

## 实例
<a name="what-is-db-instances"></a>

Amazon DocumentDB 实例是在云中运行的独立数据库环境。一个实例可以包含多个由用户创建的数据库。您可以使用 AWS 管理控制台 或创建和修改实例 AWS CLI。

实例的计算和内存容量由其*实例类*决定。您可以选择最能满足您需求的实例。如果一段时间后您的需求出现了变化，可以选择其他实例类。有关实例类的规格，请参阅[实例类规格](db-instance-classes.md#db-instance-class-specs)。

Amazon DocumentDB 实例仅在 Amazon VPC 环境中运行。Amazon VPC 让您可以控制自己的虚拟网络环境：您可以选择自己的 IP 地址范围、创建子网以及配置路由和访问控制列表 (ACLs)。

在创建 Amazon DocumentDB 实例之前，您必须创建一个集群以包含实例。

并非每个区域都支持所有实例类。下表显示了每个区域支持的实例类。

**注意**  
有关每个实例类中 Amazon DocumentDB 支持的实例类型的完整列表，请参阅 [实例类规格](db-instance-classes.md#db-instance-class-specs)。


**不同区域支持的实例类**  

|  | 实例类 | Region | R8G | R6GD | R6G | R5 | R4 | T4G | T3 | Serverless | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 美国东部（俄亥俄州） | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 
| 美国东部（弗吉尼亚州北部） | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 
| 美国西部（俄勒冈州） | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 
| 非洲（开普敦） |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 南美洲（圣保罗） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（香港） |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（海得拉巴） |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（马来西亚） |  |  | 支持 |  |  | 支持 | 支持 |  | 
| 亚太地区（孟买） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（大阪） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 |  | 
| 亚太地区（首尔） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（悉尼） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（雅加达） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 |  | 
| 亚太地区（墨尔本） |  |  | 支持 | 支持 |  | 支持 | 支持 |  | 
| 亚太地区（新加坡） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 亚太地区（泰国） |  |  | 支持 |  |  | 支持 | 支持 |  | 
| 亚太地区（东京） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 加拿大（中部） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 欧洲地区（法兰克福） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 欧洲（苏黎世） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 |  | 
| 欧洲地区（爱尔兰） | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 
| 欧洲地区（伦敦） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 欧洲地区（米兰） |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 欧洲地区（巴黎） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 欧洲（西班牙） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 欧洲地区（斯德哥尔摩） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 |  | 
| 墨西哥（中部） |  |  | 支持 |  |  | 支持 | 支持 |  | 
| 中东（阿联酋）： |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 中国（北京） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 中国（宁夏） |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| 以色列（特拉维夫） |  |  | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| AWS GovCloud （美国西部） | 支持 | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 
| AWS GovCloud （美国东部） |  | 支持 | 支持 | 支持 |  | 支持 | 支持 | 支持 | 

## 区域和可用区
<a name="what-is-regions-and-azs"></a>

区域和可用区定义集群和实例的物理位置。

### Regions
<a name="what-is-regions"></a>

AWS 云计算资源存放在世界不同地区（例如北美、欧洲或亚洲）的高可用性数据中心设施中。每个数据中心位置称为一个*地区*。

每个 AWS 区域都设计为与其他 AWS 区域完全隔离。每个区域内有多个可用区。在不同的可用区内启动节点，可以实现可能的最大容错。下图显示了 AWS 区域和可用区如何运作的高级视图。

![\[亚马逊 DocumentDB AWS 区域和可用区的高级视图。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/docdb-regions-and-azs.png)


### 可用区
<a name="what-is-availability-zones"></a>

每个 AWS 区域都包含多个不同的位置，称为*可用区*。每个可用区都被设计成不受其他可用区故障的影响，并提供低价、低延迟的网络连接，以连接到同一地区的其他可用区。通过在多个可用区中启动给定集群的实例，您可以防止应用程序出现可用区故障，尽管这种情况很少发生。

Amazon DocumentDB 架构将存储和计算分开。在存储层方面，Amazon DocumentDB 会在三个 AWS 可用区域中复制六份数据副本。例如，如果您在仅支持两个可用区的区域中启动 Amazon DocumentDB 集群，则系统会在三个可用区中以六种方式复制您的数据存储，但只有两个可用区中会有计算实例。

 下表列出了在给 AWS 区域 定可用区中可用于为集群配置计算实例的数量。


| 区域名称 | Region | 可用区（计算） | 
| --- | --- | --- | 
| 美国东部（俄亥俄州） | `us-east-2` | 3 | 
| 美国东部（弗吉尼亚州北部） | `us-east-1` | 6 | 
| 美国西部（俄勒冈州） | `us-west-2` | 4 | 
| 非洲（开普敦） | `af-south-1` | 3 | 
| 南美洲（圣保罗） | `sa-east-1` | 3 | 
| 亚太地区（香港） | `ap-east-1` | 3 | 
| 亚太地区（海得拉巴） | `ap-south-2` | 3 | 
| 亚太地区（马来西亚） | `ap-southeast-5` | 3 | 
| 亚太地区（孟买） | `ap-south-1` | 3 | 
| 亚太地区（大阪） | `ap-northeast-3` | 3 | 
| 亚太地区（首尔） | `ap-northeast-2` | 4 | 
| 亚太地区（新加坡） | `ap-southeast-1` | 3 | 
| 亚太地区（悉尼） | `ap-southeast-2` | 3 | 
| 亚太地区（雅加达） | `ap-southeast-3` | 3 | 
| 亚太地区（墨尔本） | `ap-southeast-4` | 3 | 
| 亚太地区（泰国） | `ap-southeast-7` | 3 | 
| 亚太地区（东京） | `ap-northeast-1` | 3 | 
| 加拿大（中部） | `ca-central-1` | 3 | 
| 中国（北京）区域 | `cn-north-1` | 3 | 
| 中国（宁夏） | `cn-northwest-1` | 3 | 
| 欧洲地区（法兰克福） | `eu-central-1` | 3 | 
| 欧洲（苏黎世） | `eu-central-2` | 3 | 
| 欧洲地区（爱尔兰） | `eu-west-1` | 3 | 
| 欧洲地区（伦敦） | `eu-west-2` | 3 | 
| 欧洲地区（米兰） | `eu-south-1` | 3 | 
| 欧洲地区（巴黎） | `eu-west-3` | 3 | 
| 欧洲（西班牙） | `eu-south-2` | 3 | 
| 欧洲地区（斯德哥尔摩） | `eu-north-1` | 3 | 
| 墨西哥（中部） | `mx-central-1` | 3 | 
| 中东（阿联酋）： | `me-central-1` | 3 | 
| 以色列（特拉维夫） | `il-central-1` | 3 | 
| AWS GovCloud （美国西部） | `us-gov-west-1` | 3 | 
| AWS GovCloud （美国东部） | `us-gov-east-1` | 3 | 

## Amazon DocumentDB 定价
<a name="docdb-pricing"></a>

Amazon DocumentDB 集群根据以下组件进行计费：
+ **实例小时数（按小时）**：根据实例的实例类（例如，`db.r5.xlarge`）。定价以每小时为单位列出，但账单向下计算至秒，并以十进制形式显示时间。Amazon DocumentDB 使用量以一秒的增量进行计费，时长最少 10 分钟。有关更多信息，请参阅 [管理实例类](db-instance-classes.md)。
+ **I/O 请求（每月每 100 万个请求）**— 您在账单周期内发出的存储 I/O 请求总数。
+ **备份存储（每月每 GiB）**：备份存储是指与自动数据库备份和拍摄的有效数据库快照相关联的存储。延长备份保留期或增加快照创建数量，将增加数据库所消耗的备份存储。备份存储以 GB 月使用量为单位计量，每秒计量方式不适用。有关更多信息，请参阅 [在 Amazon DocumentDB 中进行备份和还原](backup_restore.md)。
+ **数据传输（每 GB）**— 从您的实例传入和传出互联网或其他 AWS 地区的数据。

有关详细信息，请参阅[Amazon DocumentDB 定价](https://aws.amazon.com/documentdb/pricing/)。

### 免费试用
<a name="free-trial"></a>

你可以使用 1 个月免费试用期免费试用 Amazon DocumentDB。有关更多信息，请参阅[ Amazon DocumentDB 定价](https://aws.amazon.com/documentdb/pricing/)中的免费试用期或参阅[ Amazon DocumentDB 免费试用期常见问题解答](https://aws.amazon.com/documentdb/free-trial/)。

## 监控
<a name="what-is-monitoring"></a>

您可以使用多种方法对实例性能和运行状况进行跟踪。您可以使用免费的 Amazon CloudWatch 服务来监控实例的性能和运行状况。您可以查找 Amazon DocumentDB 控制台上的性能图表。您可以订阅 Amazon DocumentDB 事件，以便在实例、快照、参数组或者安全组发生更改时收取通知。

有关更多信息，请参阅下列内容：
+ [使用以下方式监控亚马逊 DocumentDB CloudWatch](cloud_watch.md)
+ [使用 AWS CloudTrail 记录 Amazon DocumentDB API 调用](logging-with-cloudtrail.md)

## 接口
<a name="what-is-interfaces"></a>

您可以通过多种方式与 Amazon DocumentDB 进行交互，包括 AWS 管理控制台 和。 AWS CLI

### AWS 管理控制台
<a name="what-is-console"></a>

 AWS 管理控制台 这是一个简单的基于 Web 的用户界面。您可以从控制台中管理集群和实例，而无需进行任何编程。[要访问亚马逊 DocumentDB 控制台，请登录 AWS 管理控制台 并打开亚马逊文档数据库控制台，网址为 /docdb。https://console.aws.amazon.com](https://console.aws.amazon.com/docdb)

### AWS CLI
<a name="what-is-cli"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 来管理您的亚马逊文档数据库集群和实例。只需极少配置即可从您喜爱的终端程序开始使用 Amazon DocumentDB 控制台提供的所有功能。
+ 要安装 AWS CLI，请参阅[安装 AWS 命令行界面](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)。
+ 要开始使用 AWS CLI 适用于亚马逊 DocumentDB 的，请参阅亚马逊 DocumentD [B 的AWS 命令行界面参考](https://docs.aws.amazon.com/cli/latest/reference/docdb/index.html)。

### MongoDB 驱动程序
<a name="what-is-mongodb-drivers"></a>

要针对 Amazon DocumentDB 集群开发和编写应用程序，您还可以将 MongoDB 驱动程序与 Amazon DocumentDB 结合使用。有关更多信息，请参阅 [启用了 TLS 的情况下的连接](connect_programmatically.md#connect_programmatically-tls_enabled) 或 [禁用了 TLS 的情况下的连接](connect_programmatically.md#connect_programmatically-tls_disabled) 中的 MongoDB Shell 选项卡。

## 接下来做什么？
<a name="what-is-next"></a>

上面章节为您介绍了 Amazon DocumentDB 提供的基本基础设施组件。您下一步该做什么？ 根据您的情况，请参阅以下主题之一了解其用法：
+ 使用创建集群和实例，开始使用 Amazon DocumentDB。 CloudFormation [亚马逊 DocumentDB 快速入门使用 CloudFormation](quick_start_cfn.md)
+ 通过使用 [入门指南](get-started-guide.md) 中的说明创建集群和实例开始使用 Amazon DocumentDB。
+ 通过使用 [开始使用 Amazon DocumentDB 弹性集群](elastic-get-started.md) 中的说明创建弹性集群开始使用 Amazon DocumentDB。
+ 使用 [迁移到 Amazon DocumentDB](docdb-migration.md) 中的指南将您的 MongoDB 实现迁移到 Amazon DocumentDB

# Amazon DocumentDB：工作方式
<a name="how-it-works"></a>

Amazon DocumentDB（与 MongoDB 兼容）是一项完全托管的 MongoDB 兼容性数据库服务。借助 Amazon DocumentDB，您可以运行与 MongoDB 相同的应用程序代码，并使用与 MongoDB 相同的驱动程序和工具。亚马逊 DocumentDB 与 MongoDB 3.6、4.0、5.0 和 8.0 兼容。

**Topics**
+ [Amazon DocumentDB 端点](#how-it-works.endpoints)
+ [TLS Support](#how-it-works.ssl)
+ [Amazon DocumentDB 存储](#how-it-works.storage)
+ [Amazon DocumentDB 复制](#how-it-works.replication)
+ [Amazon DocumentDB 可靠性](#how-it-works.reliability)
+ [读取首选项选项](#durability-consistency-isolation)
+ [TTL 删除](#how-it-works.ttl-deletes)
+ [可计费资源](#billing)

使用 Amazon DocumentDB 时，首先要创建一个*集群*。集群由零个或多个数据库实例以及管理这些实例的数据的集群卷组成。Amazon DocumentDB *集群卷*是一个跨多个可用区的虚拟数据库存储卷。每个可用区都有一个集群数据副本。

一个 Amazon DocumentDB 集群包含两个组件：
+ **集群卷**：使用云原生存储服务在三个可用区中复制数据六次，从而提供高度持久且可用的存储。一个 Amazon DocumentDB 集群只有一个集群卷，最多可存储 128 TiB 数据。
+ **实例**：提供数据库处理能力，以及向集群存储卷写入数据和从中读取数据的能力。一个 Amazon DocumentDB 集群可以有 0–16 个实例。

实例具有以下两种角色之一：
+ **主实例**：支持读写操作，并对集群卷执行所有数据修改。每个 Amazon DocumentDB 集群都有一个主实例。
+ **副本实例**：仅支持读取操作。除主实例之外，每个 Amazon DocumentDB 集群最多可拥有 15 个副本。拥有多个副本使您可以分配读取工作负载。此外，通过将副本置于单独的可用区中，您还可以提高集群可用性。

下图说明了 Amazon DocumentDB 集群中的集群卷、主实例和副本之间的关系：

![\[Amazon DocumentDB 端点，包括集群、读取器和实例端点。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/docdb-endpoint-types.png)


集群实例无需为相同的实例类，可以根据需要预置和终止它们。此体系结构允许您独立于集群的存储扩展集群的计算容量。

当您的应用程序将数据写入主实例时，主实例会执行对集群卷的持久写入。然后，它将这个写入的状态（而非数据）复制到每个活动副本。Amazon DocumentDB 副本不参与处理写入，因此 Amazon DocumentDB 副本有利于读取扩展。来自 Amazon DocumentDB 副本的读取最终具有一致性，且副本滞后时间最短：通常少于主实例写入更新后的 100 毫秒。保证按照将数据写入主实例的顺序读取副本中的数据。副本滞后取决于数据更改的速率，高写入活动的时间段可能会增加副本滞后。有关更多信息，请参阅[Amazon DocumentDB 指标](cloud_watch.md#cloud_watch-metrics_list)中的 `ReplicationLag` 指标。

## Amazon DocumentDB 端点
<a name="how-it-works.endpoints"></a>

Amazon DocumentDB 提供多种连接选项，以便为各种使用案例提供服务。要连接到 Amazon DocumentDB 集群中的实例，您需要指定实例的端点。*终端节点* 是主机地址和端口号，用冒号分隔。

我们建议您使用集群终端节点以副本集模式（请参阅 [作为副本集连接到 Amazon DocumentDB](connect-to-replica-set.md)）连接到集群，除非您有用于连接读取器终端节点或实例终端节点的特定使用案例。要将请求路由到您的副本，请选择一项驱动程序读取首选项设置，以便在满足应用程序的读取一致性要求的同时，最大程度地提高读取扩展能力。`secondaryPreferred` 读取首选项将启用副本读取，并释放主实例以执行更多工作。

可从 Amazon DocumentDB 集群使用以下端点。

### 集群端点
<a name="how-it-works.endpoints.cluster"></a>

*集群终端节点* 连接到集群的当前主实例。集群终端节点可用于读写操作。一个Amazon DocumentDB 集群只有一个集群端点。

集群终端节点为集群的读取/写入连接提供故障转移支持。如果集群的当前主实例失败并且您的集群至少有一个活动的只读副本，则集群终端节点会自动将连接请求重定向到新的主实例。在连接到 Amazon DocumentDB 集群时，我们建议您使用集群端点并以副本集模式（请参阅 [作为副本集连接到 Amazon DocumentDB](connect-to-replica-set.md)）连接到您的集群。

以下是示例 Amazon DocumentDB 集群端点：

```
sample-cluster.cluster-123456789012.us-east-1.docdb.amazonaws.com:27017
```

以下是使用此集群终端节点的示例连接字符串：

```
mongodb://username:password@sample-cluster.cluster-123456789012.us-east-1.docdb.amazonaws.com:27017
```

有关查找集群终端节点的信息，请参阅[查找集群的端点](db-cluster-endpoints-find.md)。

### 读取器端点
<a name="how-it-works.endpoints.reader"></a>

*读取器终端节点* 跨集群中的所有可用副本对只读连接进行负载平衡。如果通过 `replicaSet` 模式进行连接，则集群读取器端点将以集群端点发挥作用，这意味着在连接字符串中，副本集参数为 `&replicaSet=rs0`。在这种情况下，可以在主实例上执行写入操作。但是，如果连接指定 `directConnection=true` 的集群，则尝试通过与读取器端点的连接执行写入操作会导致错误。一个 Amazon DocumentDB 集群只有一个读取器端点。

如果集群只包含一个（主）实例，则读取器终端节点将连接到该主实例。将副本实例添加到 Amazon DocumentDB 集群时，读取器端点会在新副本处于活动状态后打开与新副本的只读连接。

以下是 Amazon DocumentDB 集群的示例读取器端点：

```
sample-cluster.cluster-ro-123456789012.us-east-1.docdb.amazonaws.com:27017
```

以下是使用读取器终端节点的示例连接字符串：

```
mongodb://username:password@sample-cluster.cluster-ro-123456789012.us-east-1.docdb.amazonaws.com:27017 
```

读取器终端节点对只读连接而不是读取请求进行负载平衡。如果某些读取器终端节点连接的使用频率高于其他连接，则读取请求可能无法在集群实例之间以相同方式取得平衡。建议以副本集形式连接到集群终端节点并利用 secondaryPreferred 读取首选项来分发请求。

有关查找集群终端节点的信息，请参阅[查找集群的端点](db-cluster-endpoints-find.md)。

### 实例端点
<a name="how-it-works.endpoints.instance"></a>

*实例终端节点* 连接到集群中的特定实例。当前主实例的实例终端节点可用于读取和写入操作。但是，尝试对只读副本的实例终端节点执行写入操作会导致错误。Amazon DocumentDB 集群的每个活动实例有一个实例端点。

对于可能不适合使用集群终端节点或读取器终端节点的场景，实例终端节点提供对特定实例的连接的直接控制。示例使用案例是配置周期性只读分析工作负载。您可以预置 larger-than-normal副本实例，使用其实例终端节点直接连接到更大的新实例，运行分析查询，然后终止该实例。使用实例终端节点可防止分析流量影响其他集群实例。

下面是 Amazon DocumentDB 集群中单个实例的示例实例端点：

```
sample-instance.123456789012.us-east-1.docdb.amazonaws.com:27017
```

下面是使用此实例终端节点的示例连接字符串：

```
mongodb://username:password@sample-instance.123456789012.us-east-1.docdb.amazonaws.com:27017 
```

**注意**  
由于故障转移事件，实例的主要角色或副本角色可能会发生变化。您的应用程序永远不应该假设特定的实例终端节点是主实例。我们不建议连接到生产应用程序的实例终端节点。相反，我们建议您使用集群终端节点以副本集模式（请参阅 [作为副本集连接到 Amazon DocumentDB](connect-to-replica-set.md)）连接到您的集群。要想对实例故障转移优先级进行更高级的控制，请参阅[了解 Amazon DocumentDB 集群容错能力](db-cluster-fault-tolerance.md)。

有关查找集群终端节点的信息，请参阅[查找实例的端点](db-instance-endpoint-find.md)。

### 副本集模式
<a name="replica-set-mode"></a>

您可以通过指定副本集名称 `rs0` 以副本集模式连接到 Amazon DocumentDB 集群端点。在副本集模式下连接可以指定“Read Concern (读取问题)”、“Write Concern (写入问题)”和“Read Preference (读取首选项)”选项。有关更多信息，请参阅 [读取一致性](#durability-consistency-isolation.read-consistency)。

下面是以副本集模式连接的示例连接字符串：

```
mongodb://username:password@sample-cluster.cluster-123456789012.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0
```

在副本集模式下连接时，您的 Amazon DocumentDB 集群将作为副本集显示给您的驱动程序和客户端。在 Amazon DocumentDB 集群中添加和删除的实例会自动反映在副本集配置中。

每个 Amazon DocumentDB 集群均包含一个默认名称为 `rs0` 的副本集。该副本集名称无法修改。

在副本集模式下连接到集群终端节点是常规用途的推荐方法。

**注意**  
Amazon DocumentDB 集群中的所有实例都在同一 TCP 端口上侦听连接。

## TLS Support
<a name="how-it-works.ssl"></a>

有关使用传输层安全性协议（TLS）连接到 Amazon DocumentDB 的更多详细信息，请参阅 [加密传输中数据](security.encryption.ssl.md)。

## Amazon DocumentDB 存储
<a name="how-it-works.storage"></a>

Amazon DocumentDB 数据存储在*集群卷*中，该卷是一个使用固态硬盘 () SSDs 的单个虚拟卷。集群卷由六个数据副本组成，可在单个 AWS 区域的多个可用区之间自动复制。此复制有助于确保您的数据具有高持久性，减少数据丢失的可能性。它还有助于确保在故障转移期间您的集群具有更高可用性，因为您的数据副本已存在于其他可用区中。这些副本可以继续向 Amazon DocumentDB 集群中的实例提供数据请求服务。

### 数据存储的计费方式
<a name="how-it-works-storage-billing"></a>

随着数据量的增加，Amazon DocumentDB 会自动增加集群卷的大小。Amazon DocumentDB 集群卷可以增长到 128 TiB 的最大容量；但是，您只需为 Amazon DocumentDB 集群卷中您使用的空间付费。从 Amazon DocumentDB 4.0 开始，当移除数据（例如，通过丢弃集群或索引）时，整个分配的空间按相当的数量减少。因此，您可以通过删除不再需要的系列、索引、数据库等来减少存储费用。在 Amazon DocumentDB 版本 3.6 中，集群卷可以重复使用删除数据后释放的空间，但卷本身的大小从不会减小。因此，在版本 3.6 中，即使释放的空间被重复使用，在删除集合或索引后，您也可能不会看到存储空间的任何变化。

**注意**  
在 Amazon DocumentDB 3.6 中，存储成本基于存储“高水位线”（在任何时间点分配给 Amazon DocumentDB 集群的最大数量）。您可以通过避免创建大量临时信息或者在移除不需要的较旧数据之前加载大量新数据的 ETL 实践来管理成本。如果从 Amazon DocumentDB 集群中删除数据导致分配大量未使用的空间，则重置高水位需要使用 `mongodump` 或 `mongorestore` 之类的工具执行逻辑数据转储和还原以转储和还原到新集群。创建和还原快照不会 减少分配的存储，因为基础存储的物理布局在还原的快照中保持不变。

**注意**  
使用诸如`mongodump`和`mongorestore`之类的实用程序会根据正在读取和写入存储卷的数据的大小收 I/O 费。

[有关亚马逊 DocumentDB 数据存储和 I/O 定价的信息，请参阅[亚马逊 DocumentDB（兼容 MongoDB](https://aws.amazon.com/documentdb/pricing)）定价和定价。 FAQs](https://aws.amazon.com/documentdb/faqs/#Pricing)

## Amazon DocumentDB 复制
<a name="how-it-works.replication"></a>

在 Amazon DocumentDB 集群中，每个副本实例都公开一个独立的端点。这些副本终端节点提供对集群卷中数据的只读访问。它们使您能够在多个复制实例上扩展数据的读取工作负载。它们还有助于在您的 Amazon DocumentDB 集群中改进数据读取性能并提高数据可用性。Amazon DocumentDB 副本也是失效转移目标，如果您的 Amazon DocumentDB 集群的主实例失效，则迅速升级这些副本。

## Amazon DocumentDB 可靠性
<a name="how-it-works.reliability"></a>

Amazon DocumentDB 的设计具有可靠、持久和容错的特点。（为了改进可用性，您应配置您的 Amazon DocumentDB 集群，使其在不同的可用区拥有多个副本实例。） Amazon DocumentDB 包括多种自动功能，使其成为很可靠的数据库解决方案。

### 存储自动修复
<a name="how-it-works.reliability.storage-auto-repair"></a>

Amazon DocumentDB 在三个可用区中维护数据的多个副本，从而大大降低了因存储故障而丢失数据的可能性。Amazon DocumentDB 会自动检测集群卷中的故障。如果集群卷的某个区段发生故障，Amazon DocumentDB 会立即修复该区段。它使用集群卷包含的其他卷中的数据以帮助确保已修复区段中的数据是最新的。因此，Amazon DocumentDB 避免了数据丢失，并减少了为从实例故障中 point-in-time恢复而执行还原的需求。

### 自动恢复缓存预热
<a name="how-it-works.reliability.survivable-cache-warming"></a>

Amazon DocumentDB 在与数据库不同的进程中管理其页面缓存，以便页面缓存可以独立于数据库而存在。万一发生数据库故障，页面缓存仍保留在内存中。这可确保在数据库重新启动时使用最新状态对缓冲池进行预热。

### 崩溃恢复
<a name="how-it-works.reliability.crash-recovery"></a>

Amazon DocumentDB 设计为几乎可以立即从崩溃中恢复，并继续为您的应用程序数据提供服务。Amazon DocumentDB 在并行线程上异步执行崩溃恢复，以便在发生崩溃后使数据库能够打开并几乎立即恢复使用。

### 资源管理
<a name="how-it-works.reliability.resource-governance"></a>

Amazon DocumentDB 保护在服务中运行关键进程（例如运行状况检查）所需的资源。为做到这点且当实例正遭遇高内存压力时，Amazon DocumentDB 将对请求节流。因此，某些操作可能排队等候内存压力消退。如果内存压力持续存在，则排队的操作可能超时。您可以使用以下 CloudWatch 指标监控是否由于内存不足而导致的服务限制操作：`LowMemThrottleQueueDepth`、、`LowMemThrottleMaxQueueDepth`、`LowMemNumOperationsThrottled`。`LowMemNumOperationsTimedOut`有关更多信息，请参阅使用监控 Amazon DocumentDB。 CloudWatch如果 LowMem CloudWatch 指标导致您的实例持续承受内存压力，我们建议您扩大实例规模，为工作负载提供额外的内存。

## 读取首选项选项
<a name="durability-consistency-isolation"></a>

Amazon DocumentDB 使用云原生共享存储服务，该服务跨三个可用区复制数据六次，以提供高水平持久性。Amazon DocumentDB 不依赖将数据复制到多个实例来实现持久性。无论集群是包含单个实例还是 15 个实例，集群的数据都具有持久性。

**Topics**
+ [写入持久性](#durability-consistency-isolation.write-durability)
+ [读取隔离](#durability-consistency-isolation.read-isolation)
+ [读取一致性](#durability-consistency-isolation.read-consistency)
+ [高可用性](#durability-consistency-isolation.high-availability)
+ [扩展读取](#durability-consistency-isolation.scaling-reads)

### 写入持久性
<a name="durability-consistency-isolation.write-durability"></a>

Amazon DocumentDB 使用一种独特的、分布式、容错、自我修复的存储系统。该系统跨三个 AWS 可用区复制六个数据副本 (V=6)，以提供高可用性和耐久性。在写入数据时，Amazon DocumentDB 在确认写入客户端之前，确保所有写入都已在大多数节点上持久记录。如果您运行的是三节点 MongoDB 副本集，则与 Amazon DocumentDB 相比，使用写入关注 `{w:3, j:true}` 将提供最佳配置。

对 Amazon DocumentDB 集群的写入必须由集群的写入器实例处理。尝试写入读取器会导致错误。来自 Amazon DocumentDB 主实例的已确认写入具有持久性，无法回滚。默认情况下，Amazon DocumentDB 有高度持久性并且不支持非持久写入选项。您无法修改持久性级别（即写关注）。Amazon DocumentDB 忽略 w=anything，并且有效的是 w: 3 和 j: true。您无法减少它。

在 Amazon DocumentDB 架构中，存储与计算是分离的，因此具有单个实例的集群拥有很高的持久性。持久性在存储层处理。因此，具有单个实例和具有三个实例的 Amazon DocumentDB 集群实现了相同级别的持久性。您可以根据特定用例配置集群，同时仍为数据提供高持久性。

对 Amazon DocumentDB 集群的写入操作在单个文档中是原子操作。

Amazon DocumentDB 不支持 `wtimeout` 选项，并且如果指定了值，将不会返回错误。对 Amazon DocumentDB 主实例的写入操作保证不会无限期阻塞。

### 读取隔离
<a name="durability-consistency-isolation.read-isolation"></a>

从 Amazon DocumentDB 实例读取只返回查询开始之前已持久存在的数据。读取从不返回在查询开始执行后修改的数据，即，任何情况下都不会进行脏读取。

### 读取一致性
<a name="durability-consistency-isolation.read-consistency"></a>

从 Amazon DocumentDB 集群读取的数据具有持久性，将不会回滚。您可以通过指定请求或连接的读取首选项来修改 Amazon DocumentDB读取的读取一致性。Amazon DocumentDB 不支持非持久读取选项。

在正常操作条件下，从 Amazon DocumentDB 集群的主实例读取数据具有很强的一致性，并且具有 read-after-write一致性。如果在写入与后续读取之间发生故障转移事件，系统可能短暂返回不具有强一致性的读取。从只读副本的所有读取最终是一致的，以相同的顺序返回数据，并且通常具有小于 100 毫秒的副本滞后。

#### Amazon DocumentDB 读取首选项
<a name="durability-consistency-isolation.read-preferences"></a>

仅当 Amazon DocumentDB 以副本集模式从集群端点读取数据时，才支持设置读取首选项。设置读取首选项会影响 MongoDB 客户端或驱动程序将读取请求路由到 Amazon DocumentDB 集群中的实例的方式。您可以为特定查询设置读取首选项，或者作为 MongoDB 驱动程序中的常规选项。（有关如何设置读取首选项的说明，请查阅客户端或驱动程序文档。）

如果您的客户端或驱动程序未在副本集模式下连接到 Amazon DocumentDB 集群端点，则指定读取首选项的结果并不明确。

Amazon DocumentDB 不支持将*标记集*设置为读取首选项。

**支持的读取首选项**
+ **`primary`**：指定 `primary` 读取首选项有助于确保将所有读取请求路由到集群的主实例。如果主实例不可用，则读取操作将失败。`primary`读取首选项可产生 read-after-write一致性，适用于优先考虑 read-after-write一致性而不是高可用性和读取扩展的用例。

  以下示例指定 `primary` 读取首选项：

  ```
  db.example.find().readPref('primary')
  ```

   
+ **`primaryPreferred`**：指定 `primaryPreferred` 读取首选项会在正常操作期间将读取请求路由到主实例。如果发生主实例故障转移，则客户端会将请求路由到副本。`primaryPreferred`读取首选项可在正常操作期间产生 read-after-write一致性，并最终在故障转移事件期间产生一致性读取。`primaryPreferred`读取首选项适用于优先考虑 read-after-write一致性而不是读取扩展但仍要求高可用性的用例。

  以下示例指定 `primaryPreferred` 读取首选项：

  ```
  db.example.find().readPref('primaryPreferred')
  ```

   
+ **`secondary`**：指定 `secondary` 读取首选项可确保只将读取请求路由到副本，不会路由到主实例。如果集群中没有副本实例，则读取请求将失败。`secondary`读取首选项可产生最终一致的读取，适用于优先考虑主实例写入吞吐量而不是高可用性和 read-after-write一致性的用例。

  以下示例指定 `secondary` 读取首选项：

  ```
  db.example.find().readPref('secondary')
  ```

   
+ **`secondaryPreferred`**：指定 `secondaryPreferred` 读取首选项可确保在一个或多个副本处于活动状态时将读取路由到只读副本。如果集群中没有活动的副本实例，则读取请求将路由到主实例。当读取由只读副本提供服务时，`secondaryPreferred` 读取首选项会产生最终一致性读取。当读取由主实例提供服务时，它会产生 read-after-write一致性（故障转移事件除外）。`secondaryPreferred`读取首选项适用于优先考虑读取扩展和高可用 read-after-write性而不是一致性的用例。

  以下示例指定 `secondaryPreferred` 读取首选项：

  ```
  db.example.find().readPref('secondaryPreferred')
  ```

   
+ **`nearest`**：指定 `nearest` 读取首选项将仅基于测量的客户端与 Amazon DocumentDB 集群中所有实例之间的延迟来路由读取请求。当读取由只读副本提供服务时，`nearest` 读取首选项会产生最终一致性读取。当读取由主实例提供服务时，它会产生 read-after-write一致性（故障转移事件除外）。`nearest`读取首选项适用于优先实现尽可能低的读取延迟和高可用 read-after-write性而不是一致性和读取扩展的用例。

  以下示例指定 `nearest` 读取首选项：

  ```
  db.example.find().readPref('nearest')
  ```

### 高可用性
<a name="durability-consistency-isolation.high-availability"></a>

Amazon DocumentDB 通过将副本用作主实例的失效转移目标来支持高度可用的集群配置。如果主实例失败，则一个 Amazon DocumentDB 副本将被提升为新的主实例，且出现短暂中断，在此期间，对主实例发出的读写请求将失败，并会出现异常。

如果您的 Amazon DocumentDB 集群不包含任何副本，则会在失败期间重新创建主实例。但是，提升 Amazon DocumentDB 副本要比重新创建主实例快得多。因此，我们建议您创建一个或多个 Amazon DocumentDB 副本作为失效转移目标。

旨在用作故障转移目标的副本应与主实例具有相同的实例类。它们应在不同于主实例的可用区中进行配置。您可以控制哪些副本作为首选故障转移目标。有关配置 Amazon DocumentDB 以实现高可用性的最佳实践，请参阅 [了解 Amazon DocumentDB 集群容错能力](db-cluster-fault-tolerance.md)。

### 扩展读取
<a name="durability-consistency-isolation.scaling-reads"></a>

Amazon DocumentDB 副本是读取扩展的理想选择。它们完全专用于集群卷上的读取操作，即副本不处理写入。数据复制发生在集群卷中，而不是在实例之间。因此，每个副本的资源都专用于处理查询，而不是复制和写入数据。

如果您的应用程序需要更多读取容量，则可以快速向集群添加副本（通常在不到十分钟的时间内完成）。如果您的读取容量要求减少，则可以删除不需要的副本。使用 Amazon DocumentDB 副本，您只需为所需的读取容量付费。

Amazon DocumentDB 通过使用“Read Preference (读取首选项)”选项支持客户端读取扩展。有关更多信息，请参阅 [Amazon DocumentDB 读取首选项](#durability-consistency-isolation.read-preferences)。

## TTL 删除
<a name="how-it-works.ttl-deletes"></a>

在特定时间范围内无法保证从通过后台进程实现的 TTL 索引区域中进行删除，只能尽力而为。实例大小、实例资源利用率、文档大小和总体吞吐量等因素会影响 TTL 删除的时间。

TTL 监视器每次删除您的文档都会产生 IO 成本，这将增加您的账单费用。如果吞吐量和 TTL 删除率提高，您应预计到账单费用会因 IO 使用量的增加而增多。

您在现有集合上创建 TTL 索引时，必须删除所有过期文档，之后创建该索引。当前的 TTL 实现就删除集合中一小部分文档进行优化，如果从一开始就对集合启用 TTL，则这情况是常见的，并且如果需要一次性删除大量文档，则这可能导致比所需更高的 IOPS。

如果您不想创建 TTL 索引来删除文档，您也可以根据时间将文档归入各个集合中，并在不再需要文档时将这些集合删除。例如：您可以每周创建一个集合再删除，而不产生 IO 成本。这可能比使用 TTL 索引明显更具成本效益。

## 可计费资源
<a name="billing"></a>

### 确定应计费的 Amazon DocumentDB 资源
<a name="billing.identifying-billable-resources"></a>

作为一项完全托管的数据库服务，Amazon DocumentDB 对实例、存储、I/O、备份和数据传输收费。有关更多信息，请参阅 [Amazon DocumentDB（与 MongoDB 兼容）定价](https://aws.amazon.com/documentdb/pricing/)。

要发现您账户中的可计费资源并可能删除这些资源，您可以使用 AWS 管理控制台 或 AWS CLI。

#### 使用 AWS 管理控制台
<a name="billing.identifying-billable-resources-con"></a>

使用 AWS 管理控制台，您可以发现您为给定内容预配置的 Amazon DocumentDB 集群、实例和快照。 AWS 区域

**查找集群、实例和快照**

1. [登录 AWS 管理控制台，然后在 /docdb 上打开亚马逊文档数据库控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/docdb)

1. 要查找默认区域以外的区域中的可计费资源，请在屏幕右上角选择要搜索 AWS 区域 的资源。  
![\[区域选择器中的弗吉尼亚州北部区域。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/db-cluster-console-region.png)

1. 在导航窗格中，选择您感兴趣的应计费资源类型：**Clusters (集群)**、**Instances (实例)** 或 **Snapshots (快照)**。  
![\[导航窗格中的集群、实例和快照。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/db-navigation-pane-clusters-instances-snapshots.png)

1. 右侧窗格中列出了该区域的所有已预置的集群、实例或快照。您将需要为集群、实例和快照付费。

#### 使用 AWS CLI
<a name="billing.identifying-billable-resources-cli"></a>

使用 AWS CLI，您可以发现您为给定内容预配置的 Amazon DocumentDB 集群、实例和快照。 AWS 区域

**查找集群和实例**  
以下代码将列出指定区域的所有集群和实例。如果要在默认区域中搜索集群和实例，可以省略 `--region` 参数。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws docdb describe-db-clusters \
    --region us-east-1 \
    --query 'DBClusters[?Engine==`docdb`]' | \
       grep -e "DBClusterIdentifier" -e "DBInstanceIdentifier"
```
对于 Windows：  

```
aws docdb describe-db-clusters ^
    --region us-east-1 ^
    --query 'DBClusters[?Engine==`docdb`]' | ^
       grep -e "DBClusterIdentifier" -e "DBInstanceIdentifier"
```
此操作的输出将类似于下文。  

```
"DBClusterIdentifier": "docdb-2019-01-09-23-55-38",
        "DBInstanceIdentifier": "docdb-2019-01-09-23-55-38",
        "DBInstanceIdentifier": "docdb-2019-01-09-23-55-382",
"DBClusterIdentifier": "sample-cluster",
"DBClusterIdentifier": "sample-cluster2",
```
**查找快照**  
以下代码将列出指定区域的所有快照。如果要在默认区域中搜索快照，可以省略 `--region` 参数。
对于 Linux、macOS 或 Unix：  

```
aws docdb describe-db-cluster-snapshots \
  --region us-east-1 \
  --query 'DBClusterSnapshots[?Engine==`docdb`].[DBClusterSnapshotIdentifier,SnapshotType]'
```
对于 Windows：  

```
aws docdb describe-db-cluster-snapshots ^
  --region us-east-1 ^
  --query 'DBClusterSnapshots[?Engine==`docdb`].[DBClusterSnapshotIdentifier,SnapshotType]'
```
此操作的输出将类似于下文。  

```
[
    [
        "rds:docdb-2019-01-09-23-55-38-2019-02-13-00-06",
        "automated"
    ],
    [
        "test-snap",
        "manual"
    ]
]
```
您只需要删除 `manual` 快照。`Automated` 快照会在您删除集群时删除。

### 删除不需要的应计费资源
<a name="billing.deleting-billable-resources"></a>

要删除集群，必须先删除集群中的所有实例。
+ 要删除实例，请参阅[删除 Amazon DocumentDB 实例](db-instance-delete.md)。
**重要**  
即使您删除集群中的实例，仍需要为与该集群关联的存储和备份用量付费。要停止所有计费，您还必须删除集群和手动快照。
+ 要删除集群，请参阅[删除 Amazon DocumentDB 集群](db-cluster-delete.md)。
+ 要删除手动快照，请参阅[删除集群快照](backup_restore-delete_cluster_snapshot.md)。

# 什么是文档数据库？
<a name="what-is-document-db"></a>

一些开发人员不根据规范化行和列来考虑其数据模型。通常，在应用程序层中，数据表示为 JSON 文档，因为开发人员将其数据模型视为文档更为直观。

文档数据库的受欢迎程度不断提高，因为开发人员可以使用他们在其应用程序代码中使用的相同文档模型格式来保存数据库中的数据。文档数据库为灵活敏捷 APIs 的开发提供了强大而直观的功能。

**Topics**
+ [使用案例](document-database-use-cases.md)
+ [了解文档](document-database-documents-understanding.md)
+ [使用文档](document-database-working-with-documents.md)

# 文档数据库使用案例
<a name="document-database-use-cases"></a>

无论您是否需要文档数据库或其他类型的数据库来管理数据，您的使用案例都将启动。对于需要一个灵活架构以实现快速迭代开发的工作负载来说，文档数据库很有用。以下是一些使用案例的示例，文档数据库可以为这些案例提供显著的优势：

**Topics**
+ [用户配置文件](#document-databases-use-cases.user-profiles)
+ [实时大数据](#document-databases-use-cases.big-data)
+ [内容管理](#document-databases-use-cases.content-management)

## 用户配置文件
<a name="document-databases-use-cases.user-profiles"></a>

由于文档数据库具有灵活架构，他们可以存储具有不同属性和数据值的文档。文档数据库是在线资料的实际解决方案，其中不同的用户提供不同类型的信息。使用文档数据库，通过仅存储特定于每个用户的属性，您可以高效地存储每个用户的资料。

假设用户选择添加或删除其资料中的信息。在这种情况下，其文档可轻易被一个更新的版本所取代，更新的版本包含任何最近添加的属性和数据，或者省略任何新省略的属性和数据。文档数据库轻松管理此级别的个人性和流动性。

## 实时大数据
<a name="document-databases-use-cases.big-data"></a>

从历史上看，操作数据库和分析数据库是在不同的环境中维护的（分别是操作环境和分析数据库），这一事实阻碍了从操作数据中提取信息的能力。 business/reporting 在竞争激烈的商业环境中，能够实时提取运营信息至关重要。通过使用文档数据库，企业可以存储和管理任何来源的运营数据，并将数据并发到选择的 BI 引擎进行分析。无需具备两种环境。

## 内容管理
<a name="document-databases-use-cases.content-management"></a>

要有效地管理内容，您必须能够从各种来源收集和汇总内容，然后将其交付给客户。由于其灵活的架构，文档数据库非常适合用于收集和存储任何类型的数据。您可以使用它们来创建和引入新类型的内容，包括用户生成的内容，如图像、评论和视频。

# 了解文档
<a name="document-database-documents-understanding"></a>

文档数据库用于将半结构化数据存储为文档，而不是像关系数据库那样在多个表之间对数据进行规范化，每个表都有唯一的固定结构。存储在文档数据库中的文档使用嵌套键值对来提供文档的结构或架构。不过，不同类型的文档可以存储在同一文档数据库中，从而满足了处理不同格式的类似数据的要求。例如，由于每个文档都是自描述的，主题[文档数据库中的示例文档](#document-database-documents)中所述的在线存储的 JSON 编码文档可以存储在同一个文档数据库中。

**Topics**
+ [SQL 和非关系数据库对比](#document-database-sql-vs-nosql-terms)
+ [简单文档](#document-database-documents-simple)
+ [嵌入文档](#document-database-documents-embeded)
+ [文档数据库中的示例文档](#document-database-documents)
+ [了解文档数据库中的规范化](#document-database-normalization)

## SQL 和非关系数据库对比
<a name="document-database-sql-vs-nosql-terms"></a>

下表对文档数据库 (MongoDB) 使用的术语与 SQL 数据库使用的术语进行了比较。


|  SQL  |  MongoDB  | 
| --- | --- | 
|  表  |  集合  | 
|  行  |  文档  | 
|  列  |  字段  | 
|  主键  |  ObjectId  | 
|  索引  |  索引  | 
|  视图  |  视图  | 
|  嵌套表或对象  |  嵌入文档  | 
|  数组  |  数组  | 

## 简单文档
<a name="document-database-documents-simple"></a>

文档数据库中的所有文档都是自描述的。虽然此文档使用类似 JSON 格式的文档，但您可以使用其他编码方式。

简单文档具有一个或多个字段，这些字段在文档中都处于同一级别。在以下示例中，字段 `SSN`、`LName`、`FName`、`DOB`、`Street`、`City`、`State-Province`、`PostalCode` 和 `Country` 在文档中属于同级。

```
{
   "SSN": "123-45-6789",
   "LName": "Rivera",
   "FName": "Martha",
   "DOB": "1992-11-16",
   "Street": "125 Main St.",
   "City": "Anytown",
   "State-Province": "WA",
   "PostalCode": "98117",
   "Country": "USA"
}
```

在简单文档中组织信息时，每个字段将被单独管理。要检索个人的地址，必须作为单个数据项检索 `Street`、`City`、`State-Province`、`PostalCode` 和 `Country`。

## 嵌入文档
<a name="document-database-documents-embeded"></a>

复杂文档通过在文档中创建嵌入文档来组织数据。嵌入文档帮助管理分组中作为单个数据项的数据，这些数据项在特定情况下效率更高。使用上述示例，您可以在主文档中嵌入 `Address` 文档。这样做会生成以下文档结构：

```
{
   "SSN": "123-45-6789",
   "LName": "Rivera",
   "FName": "Martha",
   "DOB": "1992-11-16",
   "Address": 
   {
       "Street": "125 Main St.",
       "City": "Anytown",
       "State-Province": "WA",
       "PostalCode": "98117",
       "Country": "USA" 
   }
}
```

现在，您可以作为单个字段 (`"SSN":`)、嵌入文档 (`"Address":`) 或嵌入文档的成员 (`"Address":{"Street":}`) 对文档中的数据进行访问。

## 文档数据库中的示例文档
<a name="document-database-documents"></a>

如上所述，因为数据库中的每个文档是自描述的，文档数据库中的文档结构可能彼此不同。以下两个文档，一个是图书文档，另一个是为期刊文档，在结构上有所不同。不过，它们可以位于同一个文档数据库中。

下面是一个示例图书文档：

```
{
    "_id" : "9876543210123",
    "Type": "book",
    "ISBN": "987-6-543-21012-3",
    "Author": 
    {
        "LName":"Roe",
        "MI": "T",
        "FName": "Richard" 
    },
    "Title": "Understanding Document Databases"
}
```

以下是带有两篇文章的示例期刊文档：

```
{
    "_id" : "0123456789012",
    "Publication": "Programming Today",
    "Issue": 
    {
        "Volume": "14",
        "Number": "09"
    },
    "Articles" : [ 
        {
            "Title": "Is a Document Database Your Best Solution?",
            "Author": 
            {
                "LName": "Major",
                "FName": "Mary" 
            }
        },
        {
            "Title": "Databases for Online Solutions",
            "Author": 
            {
                "LName": "Stiles",
                "FName": "John" 
            }
        }
    ],
    "Type": "periodical"
}
```

比较这两个文档的结构。借助关系数据库，您需要单独的“periodical”和“books”表或未使用字段的单个表作为 `null` 值，例如“发布”、“问题”、“文章”和“MI”。由于文档数据库是半结构化的，每个文档都定义了自己的结构，因此这两个文档可以在同一个文档数据库中共存，而没有 `null` 字段。文档数据库善于处理稀疏数据。

针对文档数据库进行开发，可以实现快速、迭代的开发。这是因为您可以动态地更改文档的数据结构，而不必更改整个集合的架构。文档数据库非常适合敏捷开发和动态变化的环境。

## 了解文档数据库中的规范化
<a name="document-database-normalization"></a>

文档数据库未规范化；在一个文档中发现的数据可以在另一个文档中重复。此外，文档之间可能存在一些数据差异。例如，假设您在网上商店购物，所有购物的详细信息都存储在一个文档中。文档应类似于以下 JSON 文档：

```
{
    "DateTime": "2018-08-15T12:13:10Z",
    "LName" : "Santos",
    "FName" : "Paul",
    "Cart" : [ 
        {
            "ItemId" : "9876543210123",
            "Description" : "Understanding Document Databases",
            "Price" : "29.95"
        },
        {
            "ItemId" : "0123456789012",
            "Description" : "Programming Today",
            "Issue": {
                "Volume": "14",
                "Number": "09"
            },
            "Price" : "8.95"
        },
        {
            "ItemId": "234567890-K",
            "Description": "Gel Pen (black)",
            "Price": "2.49" 
        }
    ],
    "PaymentMethod" : 
    {
        "Issuer" : "MasterCard",
        "Number" : "1234-5678-9012-3456" 
    },
    "ShopperId" : "1234567890" 
}
```

所有这些信息都作为文档存储在交易集合中。后来，您意识到忘记购买一件物品。因此，您再次登录同一家商店，进行另一次购买，这也是作为另一个文档存储在交易集合中。

```
{
    "DateTime": "2018-08-15T14:49:00Z",
    "LName" : "Santos",
    "FName" : "Paul",
    "Cart" : [ 
        {
            "ItemId" : "2109876543210",
            "Description" : "Document Databases for Fun and Profit",
            "Price" : "45.95"
        } 
    ],
    "PaymentMethod" : 
    {
        "Issuer" : "Visa",
        "Number" : "0987-6543-2109-8765" 
    },
    "ShopperId" : "1234567890" 
}
```

请注意这两个文档之间的冗余：您的姓名和购物者 ID（此外，如果您使用相同的信用卡，您的信用卡信息）。但这没关系，因为存储成本低廉，每个文档都完整记录了单个交易，只需简单的键值查询就可以快速检索，不需要连接。

两个文档之间也存在明显差异：您的信用卡信息。这只是一个明显差异，因为可能您每次购买都使用不同的信用卡。每个文档对其记录的交易都是准确的。

# 使用文档
<a name="document-database-working-with-documents"></a>

作为文档数据库，Amazon DocumentDB 可以轻松存储、查询和索引 JSON 数据。在 Amazon DocumentDB 中，除了没有对所有文档强制实施单一架构外，文档数据库集合类似于关系数据库中的表。集合允许您将类似的文档分组在一起，同时将它们保存在同一数据库中，而不需要它们在结构上相同。

使用前面部分的示例文档，您可能会有针对 `reading_material` 和 `office_supplies` 的集合。您的软件有责任强制执行文档属于哪个集合。

以下示例使用 MongoDB API 来展示如何添加、查询、更新和删除文档。

**Topics**
+ [添加文档](#document-database-adding-documents)
+ [查询文档](#document-database-queries)
+ [更新文档](#document-database-updating)
+ [删除文档](#document-database-deleting)

## 添加文档
<a name="document-database-adding-documents"></a>

在 Amazon DocumentDB 中，首次向集合添加文档时会创建数据库。在此示例中，您将在 `test` 数据库中创建名为 `example` 的集合，该集合是连接到集群时的默认数据库。由于插入第一个文档时隐式创建连接，因此集合名称没有错误检查。因此，集合名称中的拼写错误（例如 `eexample` 而不是 `example`）将创建文档并将其添加到 `eexample` 集合，而不是预期集合中。错误检查必须由您的应用程序进行处理。

以下示例使用 MongoDB API 来添加文档。

**Topics**
+ [添加单个文档](#document-database-adding-documents-single)
+ [添加多个文档](#document-database-adding-documents-multiple)

### 添加单个文档
<a name="document-database-adding-documents-single"></a>

要将单个文档添加至集合，请使用带有您想添加至集合的文档的 `insertOne( {} )` 操作。

```
db.example.insertOne(
    {
        "Item": "Ruler",
        "Colors": ["Red","Green","Blue","Clear","Yellow"],
        "Inventory": {
            "OnHand": 47,
            "MinOnHand": 40
        },
        "UnitPrice": 0.89
    }
)
```

此操作的输出将类似于下文（JSON 格式）。

```
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5bedafbcf65ff161707de24f")
}
```

### 添加多个文档
<a name="document-database-adding-documents-multiple"></a>

要将多个文档添加至集合，请使用带有您想添加至集合的文档列表的 `insertMany( [{},...,{}] )` 操作。虽然此特定列表中的文档具有不同的架构，但它们都可以添加至同一个集合。

```
db.example.insertMany(
    [
        {
            "Item": "Pen",
            "Colors": ["Red","Green","Blue","Black"],
            "Inventory": {
                "OnHand": 244,
                "MinOnHand": 72 
            }
        },
        {
            "Item": "Poster Paint",
            "Colors": ["Red","Green","Blue","Black","White"],
            "Inventory": {
                "OnHand": 47,
                "MinOnHand": 50 
            }
        },
        {
            "Item": "Spray Paint",
            "Colors": ["Black","Red","Green","Blue"],
            "Inventory": {
                "OnHand": 47,
                "MinOnHand": 50,
                "OrderQnty": 36
            }
        }    
    ]
)
```

此操作的输出将类似于下文（JSON 格式）。

```
{
    "acknowledged" : true,
    "insertedIds" : [
            ObjectId("5bedb07941ca8d9198f5934c"),
            ObjectId("5bedb07941ca8d9198f5934d"),
            ObjectId("5bedb07941ca8d9198f5934e")
    ]
}
```

## 查询文档
<a name="document-database-queries"></a>

有时，您可能需要查看在线商店的库存，这样客户就能看到并购买您销售的物品。查询集合相对容易，无论您想要集合中的所有文档，还是仅需要那些满足特定标准的文档。

要查询文档，请使用 `find()` 操作。`find()` 命令具有单个文档参数，该参数定义了在选择要返回的文档时要使用的标准。`find()` 的输出是一个文档，其格式为一行文本，不含换行符。要格式化输出文档，从而更加轻松地读取，请使用 `find().pretty()`。本主题中的所有示例都使用 `.pretty()` 设置输出的格式。

使用您在前两个练习（即 `insertOne()` 和 `insertMany()`）中插入到 `example` 集合中的四个文档。

**Topics**
+ [检索集合中的所有文档](#document-database-queries-all-documents)
+ [检索与字段值匹配的文档](#document-database-queries-match-criteria)
+ [检索与嵌入文档匹配的文档](#document-database-queries-entire-embedded-document)
+ [检索与嵌入文档中的字段值匹配的文档](#document-database-queries-embeded-document-field)
+ [检索与数组匹配的文档](#document-database-queries-array-match)
+ [检索与数组中的值匹配的文档](#document-database-queries-array-value-match)
+ [使用运算符检索文档](#document-database-query-operators)

### 检索集合中的所有文档
<a name="document-database-queries-all-documents"></a>

要检索集合中的所有文档，请将 `find()` 操作和空查询文档结合使用。

以下查询返回 `example` 集合中的所有文档。

```
db.example.find( {} ).pretty()
```

### 检索与字段值匹配的文档
<a name="document-database-queries-match-criteria"></a>

要检索与字段和值匹配的所有文档，请将 `find()` 操作和查询文档（标识要匹配的字段和值）结合使用。

通过使用前述文档，此查询将返回其中“Item”字段等于“Pen”的所有文档。

```
db.example.find( { "Item": "Pen" } ).pretty()
```

### 检索与嵌入文档匹配的文档
<a name="document-database-queries-entire-embedded-document"></a>

要查找与嵌入文档匹配的所有文档，请将 `find()` 操作和查询文档（指定嵌入文档名称和嵌入文档的所有字段和值）结合使用。

在与嵌入文档匹配时，该文档的嵌入文档的名称必须与查询中的名称相同。此外，嵌入文档中的字段和值必须与查询匹配。

以下查询仅返回“Poster Paint”文档。这是因为“Pen”具有不同的“`OnHand`”和“`MinOnHand`”值，并且“Spray Paint”比查询文档多一个字段 (`OrderQnty`)。

```
db.example.find({"Inventory": {
    "OnHand": 47,
    "MinOnHand": 50 } } ).pretty()
```

### 检索与嵌入文档中的字段值匹配的文档
<a name="document-database-queries-embeded-document-field"></a>

要查找与嵌入文档匹配的所有文档，请将 `find()` 操作和查询文档（指定嵌入文档名称和嵌入文档的所有字段和值）结合使用。

考虑到上述文档，以下查询使用“点表示法”来指定嵌入文档和感兴趣的字段。将返回所有与这些内容匹配的文档，而不管嵌入文档中可能存在哪些其他字段。此查询将返回“Poster Paint”和“Spray Paint”，因为它们与指定的字段和值匹配。

```
db.example.find({"Inventory.OnHand": 47, "Inventory.MinOnHand": 50 }).pretty()
```

### 检索与数组匹配的文档
<a name="document-database-queries-array-match"></a>

要查找所有与数组匹配的文档，请将 `find()` 操作和您感兴趣的数组名称以及数组中的所有值结合使用。此查询将返回所有包含带该名称的数组（其中数组值和顺序与查询中的完全相同）的文档。

以下查询仅返回“Pen”，因为“Poster Paint”具有其他颜色 (White)，并且“Spray Paint”具有顺序不同的颜色。

```
db.example.find( { "Colors": ["Red","Green","Blue","Black"] } ).pretty() 
```

### 检索与数组中的值匹配的文档
<a name="document-database-queries-array-value-match"></a>

要查找所有具有特定数组值的文档，请将 `find()` 操作与您感兴趣的数组名称和值结合使用。

```
db.example.find( { "Colors": "Red" } ).pretty() 
```

上述操作将返回所有三个文档，因为它们都有一个名为 `Colors` 的数组，并且此数组中的某个位置具有“`Red`”值。如果您指定值“`White`”，则查询将仅返回“Poster Paint”。

### 使用运算符检索文档
<a name="document-database-query-operators"></a>

以下查询返回“`Inventory.OnHand`”值小于 50 的所有文档。

```
db.example.find(
        { "Inventory.OnHand": { $lt: 50 } } )
```

有关支持的查询运算符的列表，请参阅 [查询和投影运算符](mongo-apis.md#mongo-apis-query)。

## 更新文档
<a name="document-database-updating"></a>

通常，您的文档不是静态的，而是作为应用程序工作流的一部分进行更新。以下示例展示了更新文档的一些方法。

要更新现有文档，请使用 `update()` 操作。`update()` 操作具有两个文档参数。第一个文档标识要更新的文档。第二个文档指定要进行的更新。

在更新现有字段时，无论该字段是简单字段、数组还是嵌入文档 ，都请指定字段名及其值。在操作结束时，旧文档中的字段似乎已替换为新的字段和值。

**Topics**
+ [更新现有字段的值](#document-database-updating-existing-fields)
+ [添加新字段](#document-database-updating-adding-field)
+ [替换嵌入文档](#document-database-replacing-embedded-document)
+ [将新字段插入嵌入文档](#document-database-updating-adding-field-embedded)
+ [从文档中删除字段](#document-database-remove-field)
+ [从多个文档中删除字段](#document-database-remove-field-all)

### 更新现有字段的值
<a name="document-database-updating-existing-fields"></a>

在下面的更新操作中，使用您之前添加的以下四个文档。

```
{
    "Item": "Ruler",
    "Colors": ["Red","Green","Blue","Clear","Yellow"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 40
    },
    "UnitPrice": 0.89
},
{
    "Item": "Pen",
    "Colors": ["Red","Green","Blue","Black"],
    "Inventory": {
        "OnHand": 244,
        "MinOnHand": 72 
    }
},
{
    "Item": "Poster Paint",
    "Colors": ["Red","Green","Blue","Black","White"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50 
    }
},
{
    "Item": "Spray Paint",
    "Colors": ["Black","Red","Green","Blue"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50,
        "OrderQnty": 36
    }
}
```

**更新简单字段**  
要更新简单字段，请将 `update()` 和 `$set` 结合使用以指定字段名和新值。以下示例将 `Item` 从“Pen”更改为“Gel Pen”。

```
db.example.update(
    { "Item" : "Pen" },
    { $set: { "Item": "Gel Pen" } }
)
```

此操作的结果将类似于下文。

```
{
    "Item": "Gel Pen",
    "Colors": ["Red","Green","Blue","Black"],
    "Inventory": {
        "OnHand": 244,
        "MinOnHand": 72 
    }
}
```

**更新数组**  
以下示例将现有颜色数组替换为新数组（其中包括 `Orange`）并从颜色列表中删除 `White`。新的颜色列表的顺序是在 `update()` 操作中指定的。

```
db.example.update(
    { "Item" : "Poster Paint" },
    { $set: { "Colors": ["Red","Green","Blue","Orange","Black"] } }
)
```

此操作的结果将类似于下文。

```
{
    "Item": "Poster Paint",
    "Colors": ["Red","Green","Blue","Orange","Black"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50 
    }
}
```

### 添加新字段
<a name="document-database-updating-adding-field"></a>

要通过添加一个或多个新字段修改文档，请使用带有查询文档的 `update()` 操作，该查询文档使用 `$set` 运算符标识要插入的文档及新字段和值。

以下示例将值为 `3.99` 的字段 `UnitPrice` 添加到 Spray Paints 文档。请注意，值 `3.99` 是数字，而不是字符串。

```
db.example.update(
    { "Item": "Spray Paint" },
    { $set: { "UnitPrice": 3.99 } } 
)
```

此操作的结果将类似于下文。

```
{
    "Item": "Spray Paint",
    "Colors": ["Black","Red","Green","Blue"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50,
        "OrderQnty": 36
    },
    "UnitPrice": 3.99
}
```

### 替换嵌入文档
<a name="document-database-replacing-embedded-document"></a>

要通过替换嵌入文档来修改文档，请将 `update()` 操作和文档（使用 `$set` 运算符标识嵌入文档及其新字段和值）结合使用。

给定以下文档。

```
db.example.insert({
    "DocName": "Document 1",
    "Date": {
        "Year": 1987,
        "Month": 4,
        "Day": 18
    }
})
```

**替换嵌入文档**  
以下示例将当前 Date 文档替换为新文档，后者仅具有 `Month` 和 `Day` 字段；并且已消除 `Year`。

```
db.example.update(
    { "DocName" : "Document 1" },
    { $set: { "Date": { "Month": 4, "Day": 18 } } }
)
```

此操作的结果将类似于下文。

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18
    }
}
```

### 将新字段插入嵌入文档
<a name="document-database-updating-adding-field-embedded"></a>

**将字段添加到嵌入文档**  
要通过向嵌入文档添加一个或多个新字段来修改文档，请将 `update()` 操作与文档（标识嵌入文档）结合使用，并使用“点表示法”通过 `$set` 运算符指定嵌入文档以及要插入的新字段和值。

给定下面的文档，以下代码使用“点表示法”将 `Year` 和 `DoW` 字段插入嵌入式 `Date` 文档中，并将 `Words` 插入父文档中。

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18
    }
}
```

```
db.example.update(
    { "DocName" : "Document 1" },
    { $set: { "Date.Year": 1987, 
              "Date.DoW": "Saturday",
              "Words": 2482 } }
)
```

此操作的结果将类似于下文。

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18,
        "Year": 1987,
        "DoW": "Saturday"
    },
    "Words": 2482
}
```

### 从文档中删除字段
<a name="document-database-remove-field"></a>

要通过删除文档中的字段来修改文档，请将 `update()` 操作与查询文档（标识要从中删除字段的文档）和 `$unset` 运算符（指定要删除的字段）结合使用。

以下示例从前述文档中删除 `Words` 字段。

```
db.example.update(
    { "DocName" : "Document 1" },
    { $unset: { Words:1 } }
)
```

此操作的结果将类似于下文。

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18,
        "Year": 1987,
        "DoW": "Saturday"
    }
}
```

### 从多个文档中删除字段
<a name="document-database-remove-field-all"></a>

要通过从多个文档中删除字段来修改文档，请使用具有 `$unset` 运算符和 `multi` 选项的 `update()` 操作设置为 `true`。

以下示例从示例集合中的所有文档中删除 `Inventory` 字段。如果文档没有 `Inventory` 字段，则不对该文档采取任何操作。如果省略了 `multi: true`，则仅只在符合标准的第一个文档上执行此操作。

```
db.example.update(
    {},
    { $unset: { Inventory:1 } },
    { multi: true }
)
```

## 删除文档
<a name="document-database-deleting"></a>

要从您的数据库删除文档，请使用 `remove()` 操作，指定要删除哪个文档。以下代码将从 `example` 集合中删除“Gel Pen”。

```
db.example.remove( { "Item": "Gel Pen" } )
```

要删除数据库中的所有文档，请将 `remove()` 操作和空查询结合使用。

```
db.example.remove( { } )
```