

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

# 什么是文档数据库？
<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( { } )
```