

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 什麼是 Amazon DocumentDB （具備 MongoDB 相容性）
<a name="what-is"></a>

Amazon DocumentDB （與 MongoDB 相容） 是一種快速、可靠且全受管的資料庫服務。Amazon DocumentDB 可讓您輕鬆地在雲端中設定、操作和擴展與 MongoDB 相容的資料庫。透過 Amazon DocumentDB，您可以執行相同的應用程式程式碼，並使用與 MongoDB 搭配使用的相同驅動程式和工具。

使用 Amazon DocumentDB 之前，您應該檢閱中所述的概念和功能[運作方式](how-it-works.md)。接著再完成 [入門指南](get-started-guide.md) 中的步驟。

**Topics**
+ [概觀](#overview)
+ [叢集](#what-is-db-clusters)
+ [執行個體](#what-is-db-instances)
+ [區域和 AZ](#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 支援兩種類型的叢集：執行個體型叢集和彈性叢集。彈性叢集支援每秒數百萬個讀取/寫入和 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復原。此功能可讓您將叢集還原至保留期間內任何一秒鐘的狀態，最多可恢復到前五分鐘的狀態。您可以設定最長 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 高授權 for AWS GovCloud (US) 區域和 FedRAMP AWS 美國東部/西部區域的中等授權。如需 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_tw/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)。


**各區域的支援執行個體類別**  

|  | 執行個體類別 | 區域 | R8G | R6GD | R6G | R5 | R4 | T4G | T3 | 無伺服器 | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 美國東部 (俄亥俄) | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 
| 美國東部 (維吉尼亞北部) | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 
| 美國西部 (奧勒岡) | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 
| 非洲 (開普敦) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 南美洲 (聖保羅) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太地區 (香港) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太地區 (海德拉巴) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太地區 (馬來西亞) |  |  | 支援 |  |  | 支援 | 支援 |  | 
| 亞太地區 (孟買) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太地區 (大阪) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 |  | 
| 亞太地區 (首爾) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太地區 (悉尼) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太地區 (雅加達) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 |  | 
| 亞太地區 (墨爾本) |  |  | 支援 | 支援 |  | 支援 | 支援 |  | 
| 亞太地區 (新加坡) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 亞太區域 (泰國) |  |  | 支援 |  |  | 支援 | 支援 |  | 
| 亞太地區 (東京) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 加拿大 (中部) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 歐洲 (法蘭克福) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 歐洲 (蘇黎世) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 |  | 
| 歐洲 (愛爾蘭) | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 支援 | 
| 歐洲 (倫敦) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 歐洲 (米蘭) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| Europe (Paris) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 歐洲 (西班牙) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 歐洲 (斯德哥爾摩) | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 |  | 
| 墨西哥 (中部) |  |  | 支援 |  |  | 支援 | 支援 |  | 
| 中東 (阿拉伯聯合大公國) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 中國 (北京) |  | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 中國 (寧夏) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| 以色列 (特拉維夫) |  |  | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| AWS GovCloud （美國西部） | 支援 | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 
| AWS GovCloud （美國東部） |  | 支援 | 支援 | 支援 |  | 支援 | 支援 | 支援 | 

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

區域與可用區域定義叢集和執行個體的實體位置。

### 大區 (Regions)
<a name="what-is-regions"></a>

AWS 雲端運算資源位於世界不同區域 （例如北美洲、歐洲或亞洲） 高度可用的資料中心設施。各資料中心位置皆稱為*區域*。

每個 AWS 區域旨在與其他 AWS 區域完全隔離。每個區域中皆有多個可用區域。藉由在不同的可用區域中啟動您的節點，您可以實現最大的容錯能力。下圖顯示 AWS 區域和可用區域運作方式的高階檢視。

![\[Amazon DocumentDB AWS 區域和可用區域的高階檢視。\]](http://docs.aws.amazon.com/zh_tw/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 區域 ，以為您的叢集佈建運算執行個體。


| 區域名稱 | 區域 | 可用區域 （運算） | 
| --- | --- | --- | 
| 美國東部 (俄亥俄) | `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 | 
| Europe (Paris) | `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 事件，以便在執行個體、快照、參數群組或安全群組發生變更時收到通知。

如需詳細資訊，請參閱下列內容：
+ [使用 CloudWatch 監控 Amazon DocumentDB](cloud_watch.md)
+ [使用 記錄 Amazon DocumentDB API 呼叫 AWS CloudTrail](logging-with-cloudtrail.md)

## 介面
<a name="what-is-interfaces"></a>

您可以透過多種方式與 Amazon DocumentDB 互動，包括 AWS 管理主控台 和 AWS CLI。

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

 AWS 管理主控台 是簡單的 Web 型使用者介面。不需編寫程式，即可從主控台管理您的叢集和執行個體。若要存取 Amazon DocumentDB 主控台，請登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb) 的 Amazon DocumentDB 主控台。

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

您可以使用 AWS Command Line Interface (AWS CLI) 來管理您的 Amazon DocumentDB 叢集和執行個體。透過最少的組態，您可以從您最愛的終端機程式開始使用 Amazon DocumentDB 主控台提供的所有功能。
+ 若要安裝 AWS CLI，請參閱[安裝 AWS 命令列界面](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)。
+ 若要開始使用 AWS CLI 適用於 Amazon DocumentDB 的 ，請參閱適用於 [AWS Amazon DocumentDB 的命令列界面參考](https://docs.aws.amazon.com/cli/latest/reference/docdb/index.html)。

### MongoDB 驅動程式
<a name="what-is-mongodb-drivers"></a>

若要針對 Amazon DocumentDB 叢集開發和寫入應用程式，您也可以搭配 Amazon DocumentDB 使用 MongoDB 驅動程式。如需詳細資訊，請參閱 [使用已啟用的 TLS 連線](connect_programmatically.md#connect_programmatically-tls_enabled)或 中的 MongoDB shell 標籤[使用已停用的 TLS 連線](connect_programmatically.md#connect_programmatically-tls_disabled)。

## 後續步驟？
<a name="what-is-next"></a>

上述各節向您介紹 Amazon DocumentDB 提供的基本基礎設施元件。接下來該怎麼做？ 根據您的情況，請參閱下列其中一個主題以開始使用：
+ 使用 建立叢集和執行個體，以開始使用 Amazon DocumentDB CloudFormation [使用 的 Amazon DocumentDB 快速入門 CloudFormation](quick_start_cfn.md)。
+ 使用 中的指示建立叢集和執行個體，以開始使用 Amazon DocumentDB[入門指南](get-started-guide.md)。
+ 使用 中的指示建立彈性叢集，以開始使用 Amazon DocumentDB[開始使用 Amazon DocumentDB 彈性叢集](elastic-get-started.md)。
+ 使用 中的指引將您的 MongoDB 實作遷移至 Amazon DocumentDB [遷移至 Amazon DocumentDB](docdb-migration.md)

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

Amazon DocumentDB （與 MongoDB 相容） 是全受管、與 MongoDB 相容的資料庫服務。透過 Amazon DocumentDB，您可以執行相同的應用程式程式碼，並使用與 MongoDB 搭配使用的相同驅動程式和工具。Amazon DocumentDB 與 MongoDB 3.6、4.0、5.0 和 8.0 相容。

**Topics**
+ [Amazon DocumentDB 端點](#how-it-works.endpoints)
+ [TLS 支援](#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_tw/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 叢集每個作用中執行個體都有一個執行個體端點。

執行個體端點對特定執行個體的連接提供直接控制，使用叢集端點或讀取器端點的案例可能不適用。範例使用案例佈建的是適用於週期性唯讀分析工作負載。您可以佈建大於一般的複本執行個體、使用其執行個體端點直接連接到新的大型執行個體、執行分析查詢，接著終止執行個體。使用執行個體端點可讓分析流量不會影響到其他叢集執行個體。

以下是 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>

您可以指定複本集名稱 ，以複本集模式連線至 Amazon DocumentDB 叢集端點`rs0`。在複本集模式中連接可讓您指定 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 支援
<a name="how-it-works.ssl"></a>

如需使用 Transport Layer Security (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 費用。

如需 Amazon DocumentDB 資料儲存和 I/O 定價的相關資訊，請參閱 [Amazon 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`。如需詳細資訊，請參閱使用 CloudWatch 監控 Amazon DocumentDB。如果您因為 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 複本集，使用 的寫入考量`{w:3, j:true}`會在與 Amazon DocumentDB 比較時產生最佳的可能組態。

Amazon DocumentDB 叢集的寫入必須由叢集的寫入器執行個體處理。嘗試寫入讀取器會導致錯誤。來自 Amazon DocumentDB 主要執行個體的已確認寫入是耐用的，無法復原。Amazon DocumentDB 預設具有高耐用性，且不支援非耐久寫入選項。您無法修改耐用性層級 (即寫入考量)。Amazon DocumentDB 會忽略 w=任何內容，且實際上是 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` 讀取偏好設定會產生先寫後讀一致性，且適用於以下使用案例：將先寫後讀一致性的優先順序排在高可用性和讀取擴展之前。

  以下範例指定 `primary` 讀取偏好設定：

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

   
+ **`primaryPreferred`**- 在正常操作下指定`primaryPreferred`讀取偏好設定路由讀取至主要執行個體。如果是主要容錯移轉，用戶端會將請求路由到複本。`primaryPreferred` 讀取偏好會在一般操作期間提供先寫後讀一致性，並在容錯移轉事件期間提供最終一致讀取。`primaryPreferred` 讀取偏好設定適用於以下使用案例：將先寫後讀一致性的優先順序排在讀取擴展之前 (但仍需要高可用性)。

  以下範例指定 `primaryPreferred` 讀取偏好設定：

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

   
+ **`secondary`**—指定`secondary`讀取偏好設定可確保讀取只會路由至複本，而不會路由至主要執行個體。如果叢集中沒有複本執行個體，讀取請求會失敗。`secondary` 讀取偏好設定會產生最終一致讀取，且適用於以下使用案例：將主要執行個體寫入傳輸量的優先順序排在高可用性和先寫後讀一致性之前。

  以下範例指定 `secondary` 讀取偏好設定：

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

   
+ **`secondaryPreferred`**- 指定`secondaryPreferred`讀取偏好設定可確保在一或多個複本處於作用中狀態時，讀取會路由至僅供讀取複本。如果沒有叢集中沒有作用中的複本執行個體，系統會將讀取請求路由到主要執行個體。`secondaryPreferred` 讀取偏好會在僅供讀取複本提供讀取服務時，提供最終一致讀取。它會在主要執行個體提供讀取服務時，提供先寫後讀一致性 (除了容錯移轉事件以外)。`secondaryPreferred` 讀取偏好設定適用於以下使用案例：將先寫後讀一致性的優先順序排在高可用性和讀取擴展之前。

  以下範例指定 `secondaryPreferred` 讀取偏好設定：

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

   
+ **`nearest`**- 指定`nearest`讀取偏好設定路由只會根據用戶端與 Amazon DocumentDB 叢集中所有執行個體之間的測量延遲進行讀取。`nearest` 讀取偏好會在僅供讀取複本提供讀取服務時，提供最終一致讀取。它會在主要執行個體提供讀取服務時，提供先寫後讀一致性 (除了容錯移轉事件以外)。`nearest` 讀取偏好設定適用於以下使用案例：將達到最低可能讀取延遲和高可用性的優先順序排在先寫後讀一致性和讀取擴展之前。

  以下範例指定 `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 透過使用讀取偏好設定選項支援用戶端讀取擴展。如需詳細資訊，請參閱[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 管理主控台，並在 https：//[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb) 開啟 Amazon DocumentDB 主控台。

1. 若要探索預設區域以外的區域中的計費資源，請在畫面右上角選擇要 AWS 區域 搜尋的 。  
![\[區域選擇器中的北維吉尼亞區域。\]](http://docs.aws.amazon.com/zh_tw/documentdb/latest/developerguide/images/db-cluster-console-region.png)

1. 在導覽窗格中，選擇您感興趣的應計費資源類型：**Clusters (叢集)**、**Instances (執行個體)** 或 **Snapshots (快照)**。  
![\[導覽窗格中的叢集、執行個體和快照。\]](http://docs.aws.amazon.com/zh_tw/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 文件來表示，因為開發人員以文件形式來思考資料模式更為直覺。

文件資料庫的普遍性一直在成長，因為它們可讓您使用和您的應用程式碼相同的文件模型格式，將資料存留於資料庫中。文件資料庫提供功能強大且直覺式的 API 進行靈活彈性開發。

**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>

過去，從操作資料擷取資訊的能力受到操作資料庫和分析資料庫在不同環境中維護的阻礙，分別是操作和商業/報告。在競爭激烈的商業環境中，即時擷取營運資訊的能力至關重要。透過使用文件資料庫，企業就能存放和管理任何來源的營運資料，並同時將資料饋送至選擇的 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  | 
| --- | --- | 
|  資料表  |  收集  | 
|  Row  |  文件  | 
|  資料行  |  欄位  | 
|  主索引鍵  |  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"
}
```

比較這兩個文件的結構。使用關聯式資料庫時，您需要使用個別的「期刊」和「書籍」表格，或是單一表格，其中未使用的欄位如「出版品」、「議題」、「文章」和「MI」為 `null` 值。由於文件資料庫為半結構化，每個文件都會定義自己的結構，因此這兩個文件在沒有 `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()` 設定輸出格式。

使用您在上述兩個練習中插入`example`集合的四個文件： `insertOne()`和 `insertMany()`。

**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()` 操作。

使用先前文件，此查詢會傳回所有文件，其中「項目」欄位等於「筆」。

```
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()` 操作，其附帶的查詢文件會指定內嵌文件名稱和該內嵌文件的所有欄位和值。

鑒於前述文件，以下查詢使用「點表示法」指定內嵌文件和關注欄位。符合這些的任何文件將會傳回，無論內嵌文件中可能有哪些其他欄位。查詢將傳回「廣告顏料」和「噴漆」，因為它們都符合指定的欄位和值。

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

### 擷取符合陣列的文件
<a name="document-database-queries-array-match"></a>

若要尋找符合陣列的所有文件，請使用 `find()` 操作與您感興趣的陣列名稱，以及在該陣列中的所有值。查詢將傳回所有具有該名稱的文件，其中陣列值與查詢中值及順序相同。

以下查詢只會傳回「筆」，因為「廣告顏料」有額外的顏色 (白色)，而「噴漆」有不同順序的顏色。

```
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`」，查詢只會傳回「廣告顏料」。

### 使用運算子擷取文件
<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` 運算子識別要插入其中的文件及要插入的新欄位和值。

以下範例會將欄位 `UnitPrice` 的值 `3.99` 加入到噴漆文件。請注意，值 `3.99` 是數字，不是字串。

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

此操作的結果如下所示 (JSON 格式）。

```
{
    "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
    }
})
```

**取代內嵌文件**  
以下範例將目前日期文件取代為新的欄位，其中只包含 `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` 集合移除「簽字筆」。

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

若要從資料庫中移除所有文件，請使用 `remove()`操作搭配空白查詢。

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