

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ドキュメントデータベースとは
<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 エンジンにデータをフィードできます。2 つの環境を持つ必要はありません。

## コンテンツ管理
<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>

次の表は、SQL データベースによって使用される用語とドキュメントデータベース (MongoDB) で使用される用語を比較したものです。


|  SQL  |  MongoDB  | 
| --- | --- | 
|  [テーブル]  |  収集  | 
|  Row  |  ドキュメント  | 
|  列  |  フィールド  | 
|  プライマリキー  |  ObjectId  | 
|  [Index] (インデックス)  |  [Index] (インデックス)  | 
|  表示  |  表示  | 
|  ネストされたテーブルまたはオブジェクト  |  埋め込まれたドキュメント  | 
|  配列  |  配列  | 

## シンプルなドキュメント
<a name="document-database-documents-simple"></a>

ドキュメントデータベースのすべてのドキュメントは自己記述型です。このドキュメントでは、JSON に似た形式のドキュメントを使用しますが、エンコードの他の方法も使用できます。

単純ドキュメントには、ドキュメント内ですべてが同じレベルの 1 つ以上のフィールドがあります。次の例では、フィールド `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>

前に説明したように、ドキュメントデータベース内の各ドキュメントは自己記述型であるため、ドキュメントデータベース内のドキュメントの構造は、相互に異なる可能性があります。次の 2 つのドキュメント (1 つは書籍用、もう 1 つは定期刊行物用) は、構造的に異なります。ただし、両方とも同じドキュメントデータベースに存在できます。

書籍ドキュメントの例を次に示します。

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

2 つの記事を含む定期刊行物の例を以下に示します。

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

これら 2 つのドキュメントの構造を比較します。リレーショナルデータベースでは、別々の「定期刊行物」と「書籍」テーブル、または `null` の値として「刊行物」、「問題」、「記事」、「MI」など未使用のフィールドを持つ 1 つのテーブルが必要です。ドキュメントデータベースが半構造化され、各ドキュメントが独自の構造を定義しているため、それらの 2 つのドキュメントは `null` フィールドなしで同じドキュメントデータベースに共存できます。ドキュメントデータベースは、スパースデータの処理に適しています。

ドキュメントデータベースに対する開発により、迅速で反復的な開発が可能になります。これは、動的にドキュメントのデータ構造を変更でき、コレクション全体のスキーマを変更する必要がないためです。ドキュメントデータベースが適しているのは、アジャイル開発と動的に変化する環境です。

## ドキュメントデータベースの正規化について
<a name="document-database-normalization"></a>

ドキュメントデータベースは正規化されていません。そのため、1 つのドキュメントで見つかったデータを別のドキュメントで繰り返すことができます。さらに、ドキュメント間で一部のデータに相違が発生する場合があります。たとえば、オンラインストアで購入を行い、購入のすべての詳細が 1 つのドキュメントに保存されるシナリオを考えてみます。このドキュメントは、たとえば次の 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" 
}
```

この情報は、トランザクションコレクションでドキュメントとして保存されます。後で、1 つのアイテムの購入を忘れていることに気付きます。そのため、再度同じストアにログオンし、別の購入を行います。これもトランザクションコレクションの別のドキュメントとして保存されます。

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

この 2 つのドキュメント、つまり名前と買い物客 ID (同じクレジットカードを使用した場合はクレジットカード情報) の冗長性に注目してください。しかし、ストレージは安価であり、各ドキュメントは結合が必要ない単純なキーと値のクエリで迅速に取得できる単一のトランザクションを完全に記録するため、問題はありません。

また、2 つの文書の間には、クレジットカード情報という明らかな相違があります。これは明らかな相違であるのは、各購入で別のクレジットカードを使用した可能性が高いためです。各ドキュメントは、記録されるトランザクションについては正確です。

# ドキュメントでの作業
<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 では、コレクションにドキュメントを最初に追加したときにデータベースが作成されます。次の例では、`example` という名前のコレクションを `test` データベースに作成しています。これは、クラスターに接続するときのデフォルトのデータベースです。最初のドキュメントの挿入時に接続が暗黙で作成されるため、コレクション名のエラーチェックはありません。したがって、コレクション名にタイプミス (`example` の代わりに `eexample` など) があると、正しいコレクションの代わりに `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()` からの出力は、改行のない 1 行のテキストとしてフォーマットされたドキュメントです。読みやすくするために出力ドキュメントをフォーマットするには、`find().pretty()` を使用します。このトピックのすべての例では、`.pretty()` を使用して出力を書式設定しています。

`example` と `insertOne()` の 2 つの演習で `insertMany()` コレクションに挿入した 4 つのドキュメントを使用してください。

**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」には、クエリドキュメントよりもフィールドが 1 つ (`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() 
```

上記のオペレーションは、すべてのドキュメントを返します。3 つのドキュメントのそれぞれで、`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()` オペレーションには 2 つのドキュメントパラメータがあります。最初のドキュメントでは、更新するドキュメントを識別しています。2 番目のドキュメントでは、行う更新を指定しています。

既存のフィールド ( シンプルなフィールド、配列、または埋め込みドキュメントは関係ありません) を更新する場合 フィールド名とその値を指定します。オペレーションの最後では、古いドキュメントのフィールドが新しいフィールドおよび値に置き換えられたようになります。

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

先ほど追加した次の 4 つのドキュメントを以下の更新オペレーションに使用します。

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

1 つ以上の新しいフィールドを追加してドキュメントを変更するには、挿入先のドキュメントと、`$set` 演算子を使用して挿入する新しいフィールドと値を識別するクエリドキュメントで、`update()` オペレーションを使用します。

以下の例では、値 `3.99` を含むフィールド `UnitPrice` を Spray Paints ドキュメントに追加します。値 `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
    }
})
```

**埋め込みドキュメントを置き換えるには**  
以下の例では、現在の 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>

**埋め込みドキュメントにフィールドを追加するには**  
埋め込みドキュメントに 1 つ以上の新しいフィールドを追加してドキュメントを変更するには、`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>

複数のドキュメントからフィールドを削除してドキュメントを変更するには、`update()` オペレーションを使用します (`$unset` 演算子を指定し、`multi` オプションを `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( { } )
```