

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

# 什麼是文件資料庫？
<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( { } )
```