

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

# Amazon DocumentDB の操作
<a name="documentdb-development"></a>

これらのセクションでは、Amazon DocumentDB を使用した開発について説明します。

**Topics**
+ [DocumentDB に接続する](connect-docdb.md)
+ [DocumentDB を使用したプログラム](program-docdb.md)

# Amazon DocumentDB に接続する
<a name="connect-docdb"></a>

Amazon DocumentDB には、MongoDB ドライバーを使用したプログラムによる接続、SSH トンネリングまたは AWS VPN を介した VPC 外部からの接続、Studio 3T や DataGrip などの一般的なツールなど、複数の接続オプションが用意されています。このサービスは、高可用性のためにレプリカセット接続をサポートしています。分析とレポートの場合は、JDBC または ODBC ドライバーを使用して接続できます。同じ VPC 内の EC2 インスタンスは、DocumentDB クラスターに直接接続できます。すべての接続には TLS と適切な AWS 認証情報/認証が必要です。

**Topics**
+ [プログラムによる接続](connect_programmatically.md)
+ [Amazon VPC の外部からの接続](connect-from-outside-a-vpc.md)
+ [レプリカセットとして接続する](connect-to-replica-set.md)
+ [Studio 3T を使用して接続](studio3t.md)
+ [DataGrip を使用して接続する](data-grip-connect.md)
+ [Amazon EC2 を使用した接続](connect-ec2.md)
+ [JDBC ドライバーによる接続](connect-jdbc.md)
+ [ODBC ドライバーを使用して接続します](connect-odbc.md)

# プログラムによる Amazon DocumentDB への接続
<a name="connect_programmatically"></a>

このセクションでは、複数の言語を使用して Amazon DocumentDB (MongoDB 互換）に接続する方法を示すコード例を紹介します。コード例は、Transport Layer Security (TLS) が有効または無効になっているクラスターに接続しているかどうかに基づいて、2 つのセクションに分かれています。TLS は、新しい Amazon DocumentDB クラスターに対してデフォルトで有効になっています。ただし、必要に応じて TLS を無効にすることができます。詳細については、「[転送中のデータの暗号化](security.encryption.ssl.md)」を参照してください。

クラスターが存在する VPC の外部から Amazon DocumentDB に接続しようとしている場合は、「[Amazon VPC の外部から Amazon DocumentDB クラスターへの接続](connect-from-outside-a-vpc.md)」を参照してください。

クラスターに接続する前に、TLS がクラスターで有効になっているかどうかを把握しておく必要があります。次のセクションでは、`tls` または AWS マネジメントコンソール を使用してクラスターの AWS CLI パラメータの値を確認する方法について説明します。続いて、適切なコード例を見つけて適用する操作について説明します。

**Topics**
+ [`tls` パラメータの値の確認](#connect_programmatically-determine_tls_value)
+ [TLS が有効な場合の接続](#connect_programmatically-tls_enabled)
+ [TLS が無効な場合の接続](#connect_programmatically-tls_disabled)

## `tls` パラメータの値の確認
<a name="connect_programmatically-determine_tls_value"></a>

クラスターで TLS が有効になっているかどうかは、AWS マネジメントコンソール または AWS CLI を使用して実行できる 2 段階のプロセスで確認します。

1. **クラスターを管理しているパラメータグループを確認します。**

------
#### [ Using the AWS マネジメントコンソール ]

   1. AWS マネジメントコンソール にサインインして、Amazon DocumentDB コンソール [https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb) を開いてください。

   1. 左のナビゲーションペインで **[Clusters]** (クラスター) を選択します。

   1. クラスターのリストで、クラスターの名前を選択します。

   1. 結果のページには、選択したクラスターの詳細が表示されます。[**Configuration (設定)**] タブを選択します。[**設定およびステータス**] セクションで、[**クラスターパラメータグループ**] の下にあるパラメータグループの名前を見つけます。

------
#### [ Using the AWS CLI ]

   次の AWS CLI コードでは、クラスターを管理しているパラメータを確認します。*`sample-cluster`* は、必ずクラスターの名前に置き換えてください。

   ```
   aws docdb describe-db-clusters \
       --db-cluster-identifier sample-cluster \
       --query 'DBClusters[*].[DBClusterIdentifier,DBClusterParameterGroup]'
   ```

   このオペレーションによる出力は、次のようになります。

   ```
   [
          [
              "sample-cluster",
              "sample-parameter-group"
          ]
   ]
   ```

------

1. **クラスターの `tls` パラメータグループでパラメータの値を確認します。**

------
#### [ Using the AWS マネジメントコンソール ]

   1. ナビゲーションペインで、**[パラメータグループ]** を選択します。

   1. [**クラスターパラメータグループ**] ウィンドウで、ステップ 1 からクラスターパラメータグループ名を選択します。

   1. 結果ページに、クラスターパラメータグループのパラメータが表示されます。ここで `tls` パラメータの値を確認できます。このパラメータの変更については、「[Amazon DocumentDB クラスターパラメータグループを変更する](cluster_parameter_groups-modify.md)」を参照してください。

------
#### [ Using the AWS CLI ]

   `describe-db-cluster-parameters` AWS CLI コマンドを使用して、クラスターパラメータグループのパラメータの詳細を表示できます。
   + **`--describe-db-cluster-parameters`** — パラメータグループ内のすべてのパラメータとその詳細の一覧を表示するには。
     + **`--db-cluster-parameter-group name`** — 必須。クラスターパラメータグループの名前。

   次の例では*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。

   ```
   aws docdb describe-db-cluster-parameters \
       --db-cluster-parameter-group-name sample-parameter-group
   ```

   このオペレーションによる出力は、次のようになります。

   ```
   {
           "Parameters": [
               {
                   "ParameterName": "profiler_threshold_ms",
                   "ParameterValue": "100",
                   "Description": "Operations longer than profiler_threshold_ms will be logged",
                   "Source": "system",
                   "ApplyType": "dynamic",
                   "DataType": "integer",
                   "AllowedValues": "50-2147483646",
                   "IsModifiable": true,
                   "ApplyMethod": "pending-reboot"
               },
               {
                   "ParameterName": "tls",
                   "ParameterValue": "disabled",
                   "Description": "Config to enable/disable TLS",
                   "Source": "user",
                   "ApplyType": "static",
                   "DataType": "string",
                   "AllowedValues": "disabled,enabled,fips-140-3",
                   "IsModifiable": true,
                   "ApplyMethod": "pending-reboot"
               }
           ]
   }
   ```

**注記**  
Amazon DocumentDBは、Amazon DocumentDB 5.0 (エンジンバージョン 3.0.3727) クラスター以降、ca-central-1、us-west-2、us-east-1、us-east-2、us-gov-east-1、us-gov-west-1 リージョンで FIPS 140-3 エンドポイントをサポートします。

------

`tls` パラメータの値を確認したら、続いて以下のセクションのコード例のうち 1 つを使用してクラスターに接続します。
+ [TLS が有効な場合の接続](#connect_programmatically-tls_enabled) 
+ [TLS が無効な場合の接続](#connect_programmatically-tls_disabled) 

## TLS が有効な場合の接続
<a name="connect_programmatically-tls_enabled"></a>

TLS が有効化されている Amazon DocumentDB クラスターにプログラムで接続するためのコード例を表示するには、使用する言語に該当するタブを選択してください。

転送中のデータを暗号化するには、以下のオペレーションを使用して、 `global-bundle.pem` という Amazon DocumentDB のパブリックキーをダウンロードします。

```
wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
```

アプリケーションが Microsoft Windows 上にあり、PKCS7 ファイルが必要な場合は、PKCS7 証明書バンドルをダウンロードできます。このバンドルには、[https://truststore.pki.rds.amazonaws.com/global/global-bundle.p7b](https://truststore.pki.rds.amazonaws.com/global/global-bundle.p7b) にある中間証明書とルート証明書の両方が含まれています。

------
#### [ Python ]

次のコードは、TLS が有効になっているときに Python を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
import pymongo
import sys

##Create a MongoDB client, open a connection to Amazon DocumentDB as a replica set and specify the read preference as secondary preferred
client = pymongo.MongoClient('mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') 

##Specify the database to be used
db = client.sample_database

##Specify the collection to be used
col = db.sample_collection

##Insert a single document
col.insert_one({'hello':'Amazon DocumentDB'})

##Find the document that was previously written
x = col.find_one({'hello':'Amazon DocumentDB'})

##Print the result to the screen
print(x)

##Close the connection
client.close()
```

------
#### [ Node.js ]

次のコードは、TLS が有効になっているときに Python を使用して Amazon DocumentDB に接続する方法を示しています。

**重要**  
なお、バージョン 6.13.1 より前の Node.js ドライバーには既知の制限事項があり、現在 Amazon DocumentDB の IAM ID 認証ではサポートされていません。Node.js ドライバーを使用する Node.js ドライバーとツール (例えば、mongosh) は、Node.js ドライバーバージョン 6.13.1 以降を使用するようにアップグレードする必要があります。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
var MongoClient = require('mongodb').MongoClient

//Create a MongoDB client, open a connection to DocDB; as a replica set,
//  and specify the read preference as secondary preferred

var client = MongoClient.connect(
'mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database?tls=true&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false',
{
  tlsCAFile: `global-bundle.pem` //Specify the DocDB; cert
},
function(err, client) {
    if(err)
        throw err;

    //Specify the database to be used
    db = client.db('sample-database');

    //Specify the collection to be used
    col = db.collection('sample-collection');

    //Insert a single document
    col.insertOne({'hello':'Amazon DocumentDB'}, function(err, result){
      //Find the document that was previously written
      col.findOne({'hello':'Amazon DocumentDB'}, function(err, result){
        //Print the result to the screen
        console.log(result);

        //Close the connection
        client.close()
      });
   });
});
```

------
#### [ PHP ]

次のコードは、TLS が有効になっているときに Python を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
<?php
//Include Composer's autoloader
require 'vendor/autoload.php';

$TLS_DIR = "/home/ubuntu/global-bundle.pem";

//Create a MongoDB client and open connection to Amazon DocumentDB
$client = new MongoDB\Client("mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/?retryWrites=false", ["tls" => "true", "tlsCAFile" => $TLS_DIR ]);

//Specify the database and collection to be used
$col = $client->sampledatabase->samplecollection;

//Insert a single document
$result = $col->insertOne( [ 'hello' => 'Amazon DocumentDB'] );

//Find the document that was previously written
$result = $col->findOne(array('hello' => 'Amazon DocumentDB'));

//Print the result to the screen
print_r($result);
?>
```

------
#### [ Go ]

次のコードは、TLS が有効になっているときに Go を使用して Amazon DocumentDB に接続する方法を示しています。

**注記**  
バージョン 1.2.1 現在、MongoDB Go ドライバーは `sslcertificateauthorityfile` にある最初の CA サーバー証明書のみを使用します。次のコード例では、この制限に対処するために、`sslcertificateauthorityfile` にあるすべてのサーバー証明書を、クライアントの作成時に使用されるカスタム TLS 設定に手動で追加しています。

次の例では*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。

```
package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"

	"io/ioutil"
	"crypto/tls"
	"crypto/x509"
	"errors"
)

const (
	// Path to the AWS CA file
	caFilePath = "global-bundle.pem"

	// Timeout operations after N seconds
	connectTimeout  = 5
	queryTimeout    = 30
	username        = "sample-user"
	password        = "password"
	clusterEndpoint = "sample-cluster.node.us-east-1.docdb.amazonaws.com:27017"

	// Which instances to read from
	readPreference = "secondaryPreferred"

	connectionStringTemplate = "mongodb://%s:%s@%s/sample-database?tls=true&replicaSet=rs0&readpreference=%s"
)

func main() {

	connectionURI := fmt.Sprintf(connectionStringTemplate, username, password, clusterEndpoint, readPreference)

	tlsConfig, err := getCustomTLSConfig(caFilePath)
	if err != nil {
		log.Fatalf("Failed getting TLS configuration: %v", err)
	}

	client, err := mongo.NewClient(options.Client().ApplyURI(connectionURI).SetTLSConfig(tlsConfig))
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), connectTimeout*time.Second)
	defer cancel()

	err = client.Connect(ctx)
	if err != nil {
		log.Fatalf("Failed to connect to cluster: %v", err)
	}

	// Force a connection to verify our connection string
	err = client.Ping(ctx, nil)
	if err != nil {
		log.Fatalf("Failed to ping cluster: %v", err)
	}

	fmt.Println("Connected to DocumentDB!")

	collection := client.Database("sample-database").Collection("sample-collection")

	ctx, cancel = context.WithTimeout(context.Background(), queryTimeout*time.Second)
	defer cancel()

	res, err := collection.InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})
	if err != nil {
		log.Fatalf("Failed to insert document: %v", err)
	}

	id := res.InsertedID
	log.Printf("Inserted document ID: %s", id)

	ctx, cancel = context.WithTimeout(context.Background(), queryTimeout*time.Second)
	defer cancel()

	cur, err := collection.Find(ctx, bson.D{})

	if err != nil {
		log.Fatalf("Failed to run find query: %v", err)
	}
	defer cur.Close(ctx)

	for cur.Next(ctx) {
		var result bson.M
		err := cur.Decode(&result)
		log.Printf("Returned: %v", result)

		if err != nil {
			log.Fatal(err)
		}
	}

	if err := cur.Err(); err != nil {
		log.Fatal(err)
	}

}

func getCustomTLSConfig(caFile string) (*tls.Config, error) {
	tlsConfig := new(tls.Config)
	certs, err := ioutil.ReadFile(caFile)

	if err != nil {
		return tlsConfig, err
	}

	tlsConfig.RootCAs = x509.NewCertPool()
	ok := tlsConfig.RootCAs.AppendCertsFromPEM(certs)

	if !ok {
		return tlsConfig, errors.New("Failed parsing pem file")
	}

	return tlsConfig, nil
```

------
#### [ Java ]

Java アプリケーションから TLS が有効な Amazon DocumentDB クラスターに接続する場合、プログラムは AWS 提供の認証機関 (CA) ファイルを使用して接続を検証する必要があります。Amazon RDS CA 証明書を使用するには、以下の手順に従ってください。

1. Amazon RDS CA ファイルを [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) ダウンロード。

1. 次のコマンドを実行し、ファイルに含まれている CA 認定を使用して信頼ストアを作成します。*truststore-password* は必ず変更してください。古い CA 認定 (`rds-ca-2015-root.pem`) と新しい CA 認定 (`rds-ca-2019-root.pem`) の両方を含む信頼ストアにアクセスする場合は、認定バンドルを信頼ストアにインポートできます。

   Linux オペレーティングシステムで、証明書バンドルを信頼ストアにインポートするサンプルシェルスクリプトを次に示します。次の例では*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。特に、サンプルディレクトリ「*mydir*」がスクリプトに含まれている場合は、このタスク用に作成したディレクトリに置き換えます。

   ```
   mydir=/tmp/certs
   truststore=${mydir}/rds-truststore.jks
   storepassword=truststore-password
   
   curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem
   awk 'split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1}{print > "rds-ca-" n ".pem"}' < ${mydir}/global-bundle.pem
   
   for CERT in rds-ca-*; do
     alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print')
     echo "Importing $alias"
     keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt
     rm $CERT
   done
   
   rm ${mydir}/global-bundle.pem
   
   echo "Trust store content is: "
   
   keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias 
   do
      expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'`
      echo " Certificate ${alias} expires in '$expiry'" 
   done
   ```

   macOS で証明書バンドルを信頼ストアにインポートするサンプルシェルスクリプトを次に示します。

   ```
   mydir=/tmp/certs
   truststore=${mydir}/rds-truststore.jks
   storepassword=truststore-password
   
   curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem
   split -p "-----BEGIN CERTIFICATE-----" ${mydir}/global-bundle.pem rds-ca-
   
   for CERT in rds-ca-*; do
     alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print')
     echo "Importing $alias"
     keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt
     rm $CERT
   done
   
   rm ${mydir}/global-bundle.pem
   
   echo "Trust store content is: "
   
   keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias 
   do
      expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'`
      echo " Certificate ${alias} expires in '$expiry'" 
   done
   ```

1. Amazon DocumentDB クラスターに接続する前に、プログラムで `keystore` を使用するために、アプリケーションで次のシステムプロパティを設定します。

   ```
   javax.net.ssl.trustStore: truststore
   javax.net.ssl.trustStorePassword: truststore-password;
   ```

1. 次のコードは、TLS が有効になっているときに Java を使用して Amazon DocumentDB に接続する方法を示しています。

   次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

   ```
   package com.example.documentdb;
   
   import com.mongodb.client.*;
   import org.bson.Document;
   
   public final class Test {
       private Test() {
       }
       public static void main(String[] args) {
   
           String template = "mongodb://%s:%s@%s/sample-database?ssl=true&replicaSet=rs0&readpreference=%s";
           String username = "sample-user";
           String password = "password";
           String clusterEndpoint = "sample-cluster.node.us-east-1.docdb.amazonaws.com:27017";
           String readPreference = "secondaryPreferred";
           String connectionString = String.format(template, username, password, clusterEndpoint, readPreference);
   
           String truststore = "truststore";
           String truststorePassword = "truststore-password";
   
           System.setProperty("javax.net.ssl.trustStore", truststore);
           System.setProperty("javax.net.ssl.trustStorePassword", truststorePassword);
   
           MongoClient mongoClient = MongoClients.create(connectionString);
   
           MongoDatabase testDB = mongoClient.getDatabase("sample-database");
           MongoCollection<Document> numbersCollection = testDB.getCollection("sample-collection");
   
           Document doc = new Document("name", "pi").append("value", 3.14159);
           numbersCollection.insertOne(doc);
   
           MongoCursor<Document> cursor = numbersCollection.find().iterator();
           try {
               while (cursor.hasNext()) {
                   System.out.println(cursor.next().toJson());
               }
           } finally {
               cursor.close();
           }
   
       }
   }
   ```

------
#### [ C\$1 / .NET ]

次のコードは、TLS が有効になっているときに C\$1 / .NET を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using MongoDB.Driver;
using MongoDB.Bson;

namespace DocDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string template = "mongodb://{0}:{1}@{2}/sampledatabase?tls=true&replicaSet=rs0&readpreference={3}";
            string username = "sample-user";
            string password = "password";
            string readPreference = "secondaryPreferred";
            string clusterEndpoint="sample-cluster.node.us-east-1.docdb.amazonaws.com:27017";
            string connectionString = String.Format(template, username, password, clusterEndpoint, readPreference);
            
            string pathToCAFile = "<PATH/global-bundle.p7b_file>";

            // ADD CA certificate to local trust store
            // DO this once - Maybe when your service starts
            X509Store localTrustStore = new X509Store(StoreName.Root);
            X509Certificate2Collection certificateCollection = new X509Certificate2Collection();
            certificateCollection.Import(pathToCAFile);
            try 
            {
                localTrustStore.Open(OpenFlags.ReadWrite);
                localTrustStore.AddRange(certificateCollection);
            } 
            catch (Exception ex) 
            {
                Console.WriteLine("Root certificate import failed: " + ex.Message);
                throw;
            } 
            finally 
            {
                localTrustStore.Close();
            }

            var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
            var client = new MongoClient(settings);

            var database = client.GetDatabase("sampledatabase");
            var collection = database.GetCollection<BsonDocument>("samplecollection");
            var docToInsert = new BsonDocument { { "pi", 3.14159 } };
            collection.InsertOne(docToInsert);
        }
    }
}
```

------
#### [ MongoDB Shell ]

次のコードは、TLS が有効化されている場合に、最新バージョンの mongosh、または以前の mongo シェルバージョンを使用して Amazon DocumentDB に接続してクエリする方法を示しています。

**mongosh を使用して Amazon DocumentDB に接続**

**重要**  
なお、バージョン 6.13.1 より前の Node.js ドライバーには既知の制限事項があり、現在 Amazon DocumentDB の IAM ID 認証ではサポートされていません。Node.js ドライバーを使用する Node.js ドライバーとツール (例えば、mongosh) は、Node.js ドライバーバージョン 6.13.1 以降を使用するようにアップグレードする必要があります。

次の例では*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。

```
mongosh --tls --host cluster-end-point:27017 --tlsCAFile  global-bundle.pem --username sample-user --password password --retryWrites false
```

**以前の mongo シェルバージョンを使用して Amazon DocumentDB に接続**

IAM を使用する場合は、mongo シェルの以前のバージョンを使用する必要があります。次のコマンドオプションのいずれかを入力します。

```
mongo --ssl --host cluster-end-point:27017 --sslCAFile global-bundle.pem --username sample-user --password password
```

4.2 かそれ以降のバージョンの Mongo シェルを使用している場合は、次のコードを使用して接続します。再試行可能な書き込みは Amazon DocumentDB ではサポートされていません。例外: mongo シェル を使用している場合は、どのコード文字列にも `retryWrites=false` コマンドを含めないでください。デフォルトでは、再試行可能な書き込みは無効になっています。`retryWrites=false` を含めると、通常の読み取りコマンドでは失敗する可能性があります。

```
mongo --tls --host cluster-end-point:27017 --tlsCAFile global-bundle.pem --username sample-user --password password
```

**接続をテストする**

1. 単一のドキュメントを挿入します。

   ```
   db.myTestCollection.insertOne({'hello':'Amazon DocumentDB'})
   ```

1. 以前に挿入されたドキュメントを検索します。

   ```
   db.myTestCollection.find({'hello':'Amazon DocumentDB'})
   ```

------
#### [ R ]

次のコードは、TLS が有効になっているときに mongolite ([https://jeroen.github.io/mongolite/](https://jeroen.github.io/mongolite/)) を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
#Include the mongolite library.
library(mongolite)

mongourl <- paste("mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/test2?ssl=true&",
          "readPreference=secondaryPreferred&replicaSet=rs0", sep="")
          
#Create a MongoDB client, open a connection to Amazon DocumentDB as a replica
#   set and specify the read preference as secondary preferred
client <-  mongo(url = mongourl, options = ssl_options(weak_cert_validation = F, ca ="<PATH/global-bundle.pem>"))

#Insert a single document
str <- c('{"hello" : "Amazon DocumentDB"}')
client$insert(str)

#Find the document that was previously written
client$find()
```

------
#### [ Ruby ]

次のコードは、TLS が有効になっているときに Ruby を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
require 'mongo'
require 'neatjson'
require 'json'
client_host = 'mongodb://sample-cluster.node.us-east-1.docdb.amazonaws.com:27017'
client_options = {
   database: 'test',
   replica_set: 'rs0',
   read: {:secondary_preferred => 1},
   user: 'sample-user',
   password: 'password',
   ssl: true,
   ssl_verify: true,
   ssl_ca_cert: 'PATH/global-bundle.pem',
   retry_writes: false
}


begin
   ##Create a MongoDB client, open a connection to Amazon DocumentDB as a
   ##   replica set and specify the read preference as secondary preferred
   client = Mongo::Client.new(client_host, client_options)
   
   ##Insert a single document
   x = client[:test].insert_one({"hello":"Amazon DocumentDB"})
   
   ##Find the document that was previously written
   result = client[:test].find()
   
   #Print the document
   result.each do |document|
      puts JSON.neat_generate(document)
   end
end

#Close the connection
client.close
```

------

## TLS が無効な場合の接続
<a name="connect_programmatically-tls_disabled"></a>

TLS が無効化されている Amazon DocumentDB クラスターにプログラムで接続するためのコード例を表示するには、使用する言語のタブを選択してください。

------
#### [ Python ]

次のコードは、TLS が無効になっているときに Python を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
## Create a MongoDB client, open a connection to Amazon DocumentDB as a replica set and specify the read preference as secondary preferred 
                    
import pymongo
import sys

client = pymongo.MongoClient('mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false')

##Specify the database to be used
db = client.sample_database

##Specify the collection to be used
col = db.sample_collection

##Insert a single document
col.insert_one({'hello':'Amazon DocumentDB'})

##Find the document that was previously written
x = col.find_one({'hello':'Amazon DocumentDB'})

##Print the result to the screen
print(x)

##Close the connection
client.close()
```

------
#### [ Node.js ]

次のコードは、TLS が無効になっているときに Node.js を使用して Amazon DocumentDB に接続する方法を示しています。

**重要**  
なお、バージョン 6.13.1 より前の Node.js ドライバーには既知の制限事項があり、現在 Amazon DocumentDB の IAM ID 認証ではサポートされていません。Node.js ドライバーを使用する Node.js ドライバーとツール (例えば、mongosh) は、Node.js ドライバーバージョン 6.13.1 以降を使用するようにアップグレードする必要があります。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
var MongoClient = require('mongodb').MongoClient;
                  
//Create a MongoDB client, open a connection to Amazon DocumentDB as a replica set,
//  and specify the read preference as secondary preferred
var client = MongoClient.connect(
'mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false', 
{ 
  useNewUrlParser: true
},

function(err, client) {
    if(err)
        throw err;
    //Specify the database to be used
    db = client.db('sample-database');
    
    //Specify the collection to be used
    col = db.collection('sample-collection');

    //Insert a single document
    col.insertOne({'hello':'Amazon DocumentDB'}, function(err, result){
      //Find the document that was previously written
      col.findOne({'hello':'Amazon DocumentDB'}, function(err, result){
        //Print the result to the screen
        console.log(result);
        
        //Close the connection
        client.close()
      });
   });
});
```

------
#### [ PHP ]

次のコードは、TLS が無効になっているときに PHP を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
<?php
//Include Composer's autoloader
require 'vendor/autoload.php';

//Create a MongoDB client and open connection to Amazon DocumentDB
$client = new MongoDB\Client("mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/?retryWrites=false");

//Specify the database and collection to be used
$col = $client->sampledatabase->samplecollection;

//Insert a single document
$result = $col->insertOne( [ 'hello' => 'Amazon DocumentDB'] );

//Find the document that was previously written
$result = $col->findOne(array('hello' => 'Amazon DocumentDB'));

//Print the result to the screen
print_r($result);
?>
```

------
#### [ Go ]

次のコードは、TLS が無効になっているときに Go を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

const (
	// Timeout operations after N seconds
	connectTimeout  = 5
	queryTimeout    = 30
	username        = "sample-user"
	password        = "password"
	clusterEndpoint = "sample-cluster.node.us-east-1.docdb.amazonaws.com:27017"
	
	// Which instances to read from
	readPreference           = "secondaryPreferred"
	connectionStringTemplate = "mongodb://%s:%s@%s/sample-database?replicaSet=rs0&readpreference=%s"
)

func main() {

	connectionURI := fmt.Sprintf(connectionStringTemplate, username, password, clusterEndpoint, readPreference)

	client, err := mongo.NewClient(options.Client().ApplyURI(connectionURI))
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), connectTimeout*time.Second)
	defer cancel()

	err = client.Connect(ctx)
	if err != nil {
		log.Fatalf("Failed to connect to cluster: %v", err)
	}

	// Force a connection to verify our connection string
	err = client.Ping(ctx, nil)
	if err != nil {
		log.Fatalf("Failed to ping cluster: %v", err)
	}

	fmt.Println("Connected to DocumentDB!")

	collection := client.Database("sample-database").Collection("sample-collection")

	ctx, cancel = context.WithTimeout(context.Background(), queryTimeout*time.Second)
	defer cancel()

	res, err := collection.InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})
	if err != nil {
		log.Fatalf("Failed to insert document: %v", err)
	}

	id := res.InsertedID
	log.Printf("Inserted document ID: %s", id)

	ctx, cancel = context.WithTimeout(context.Background(), queryTimeout*time.Second)
	defer cancel()

	cur, err := collection.Find(ctx, bson.D{})

	if err != nil {
		log.Fatalf("Failed to run find query: %v", err)
	}
	defer cur.Close(ctx)

	for cur.Next(ctx) {
		var result bson.M
		err := cur.Decode(&result)
		log.Printf("Returned: %v", result)

		if err != nil {
			log.Fatal(err)
		}
	}

	if err := cur.Err(); err != nil {
		log.Fatal(err)
	}

}
```

------
#### [ Java ]

次のコードは、TLS が無効になっているときに Java を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
package com.example.documentdb;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.ServerAddress;
import com.mongodb.MongoException;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import org.bson.Document;


public final class Main {
    private Main() {
    }
    public static void main(String[] args) {

        String template = "mongodb://%s:%s@%s/sample-database?replicaSet=rs0&readpreference=%s";
        String username = "sample-user";
        String password = "password";
        String clusterEndpoint = "sample-cluster.node.us-east-1.docdb.amazonaws.com:27017";
        String readPreference = "secondaryPreferred";
        String connectionString = String.format(template, username, password, clusterEndpoint, readPreference);

        MongoClientURI clientURI = new MongoClientURI(connectionString);
        MongoClient mongoClient = new MongoClient(clientURI);

        MongoDatabase testDB = mongoClient.getDatabase("sample-database");
        MongoCollection<Document> numbersCollection = testDB.getCollection("sample-collection");

        Document doc = new Document("name", "pi").append("value", 3.14159);
        numbersCollection.insertOne(doc);

        MongoCursor<Document> cursor = numbersCollection.find().iterator();
        try {
            while (cursor.hasNext()) {
                System.out.println(cursor.next().toJson());
            }
        } finally {
            cursor.close();
        }

    }
}
```

------
#### [ C\$1 / .NET ]

次のコードは、TLS が無効になっているときに C\$1 / .NET を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using MongoDB.Driver;
using MongoDB.Bson;

namespace CSharpSample
{
   class Program
    {
       static void Main(string[] args)
        {
           string template = "mongodb://{0}:{1}@{2}/sampledatabase?replicaSet=rs0&readpreference={3}";
           string username = "sample-user";
           string password = "password";
           string clusterEndpoint = "sample-cluster.node.us-east-1.docdb.amazonaws.com:27017";
           string readPreference = "secondaryPreferred";
           string connectionString = String.Format(template, username, password, clusterEndpoint, readPreference);

           var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
           var client = new MongoClient(settings);

           var database = client.GetDatabase("sampledatabase");
           var collection = database.GetCollection<BsonDocument>("samplecollection");
           var docToInsert = new BsonDocument { { "pi", 3.14159 } };
            collection.InsertOne(docToInsert);
        }
    }
}
```

------
#### [ MongoDB Shell ]

次のコードは、TLS が無効化されている場合に、最新バージョンの mongosh、または以前の mongo シェルバージョンを使用して Amazon DocumentDB に接続してクエリする方法を示しています。

**mongosh を使用して Amazon DocumentDB に接続**

**重要**  
なお、バージョン 6.13.1 より前の Node.js ドライバーには既知の制限事項があり、現在 Amazon DocumentDB の IAM ID 認証ではサポートされていません。Node.js ドライバーを使用する Node.js ドライバーとツール (例えば、mongosh) は、Node.js ドライバーバージョン 6.13.1 以降を使用するようにアップグレードする必要があります。

次の例では*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。

```
mongosh --host cluster-end-point:27017 --username sample-user --password password --retryWrites false
```

**以前の mongo シェルバージョンを使用して Amazon DocumentDB に接続**

IAM を使用する場合は、mongo シェルの以前のバージョンを使用する必要があります。次のコマンドオプションのいずれかを入力します。

```
mongo --host cluster-end-point:27017 --username sample-user --password password
```

4.2 かそれ以降のバージョンの Mongo シェルを使用している場合は、次のコードを使用して接続します。再試行可能な書き込みは Amazon DocumentDB ではサポートされていません。例外: mongo シェル を使用している場合は、どのコード文字列にも `retryWrites=false` コマンドを含めないでください。デフォルトでは、再試行可能な書き込みは無効になっています。`retryWrites=false` を含めると、通常の読み取りコマンドでは失敗する可能性があります。

```
mongo --host cluster-end-point:27017 --username sample-user --password password
```

**接続をテストする**

1. 単一のドキュメントを挿入します。

   ```
   db.myTestCollection.insertOne({'hello':'Amazon DocumentDB'})
   ```

1. 以前に挿入されたドキュメントを検索します。

   ```
   db.myTestCollection.find({'hello':'Amazon DocumentDB'})
   ```

------
#### [ R ]

次のコードは、TLS が無効になっているときに mongolite ([https://jeroen.github.io/mongolite/](https://jeroen.github.io/mongolite/)) を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
#Include the mongolite library.
library(mongolite)
               
#Create a MongoDB client, open a connection to Amazon DocumentDB as a replica
#   set and specify the read preference as secondary preferred
client <- mongo(url = "mongodb://sample-user:password@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database?readPreference=secondaryPreferred&replicaSet=rs0")

##Insert a single document
str <- c('{"hello" : "Amazon DocumentDB"}')
client$insert(str)

##Find the document that was previously written
client$find()
```

------
#### [ Ruby ]

次のコードは、TLS が無効になっているときに Ruby を使用して Amazon DocumentDB に接続する方法を示しています。

次の例では、各 *ユーザー入力プレースホルダー* をクラスターの情報に置き換えます。

```
require 'mongo'
require 'neatjson'
require 'json'
client_host = 'mongodb://sample-cluster.node.us-east-1.docdb.amazonaws.com:27017'
client_options = {
   database: 'test',
   replica_set: 'rs0',
   read: {:secondary_preferred => 1},
   user: 'sample-user',
   password: 'password',
   retry_writes: false
}
               
begin
   ##Create a MongoDB client, open a connection to Amazon DocumentDB as a
   ##   replica set and specify the read preference as secondary preferred
   client = Mongo::Client.new(client_host, client_options)
   
   ##Insert a single document
   x = client[:test].insert_one({"hello":"Amazon DocumentDB"})
   
   ##Find the document that was previously written
   result = client[:test].find()
   
   #Print the document
   result.each do |document|
      puts JSON.neat_generate(document)
   end
end

#Close the connection
client.close
```

------

# Amazon VPC の外部から Amazon DocumentDB クラスターへの接続
<a name="connect-from-outside-a-vpc"></a>

Amazon DocumentDB (MongoDB 互換) クラスターは、Amazon VPC (Amazon Virtual Private Cloud) 内にデプロイされます。それらのクラスターには、同じ Amazon VPC にデプロイされている Amazon EC2 インスタンスや他の AWS のサービスから直接アクセスできます。また、Amazon DocumentDB には、同じ AWS のリージョン内に、あるいは VPC ピアリングを介する別のリージョン内にある異なる VPC の中の EC2 インスタンスや他の AWS リージョン のサービスによってアクセスできます。

ただし、お客様のユースケースで、お客様 (またはお客様のアプリケーション) が、クラスターの VPC の外部から Amazon DocumentDB リソースにアクセスする必要があるとします。その場合は、SSH トンネリング (*ポート転送* とも呼ばれる) を使用して、Amazon DocumentDB リソースにアクセスできます。

SSH トンネリングに関する詳細な説明は、このトピックでは扱いません。SSH トンネリングの詳細については、次のドキュメントを参照してください。
+ [SSH トンネル](https://www.ssh.com/ssh/tunneling/) 
+ [SSH ポート転送の例](https://www.ssh.com/ssh/tunneling/example)、特に「[ローカル転送](https://www.ssh.com/ssh/tunneling/example#sec-Local-Forwarding)」セクション

SSH トンネルを作成するには、Amazon DocumentDB クラスターと同じ Amazon VPC で実行中の Amazon EC2 インスタンスが必要です。クラスターと同じ VPC で既存の EC2 インスタンスを使用するか、新しい EC2 インスタンスを作成できます。詳細については、以下でオペレーティングシステムに該当するトピックを参照してください。
+ [Amazon EC2 Linux インスタンスの使用開始](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)
+ [Amazon EC2 Windows インスタンスの開始方法](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html)

通常、以下のコマンドを使用して EC2 インスタンスに接続します。

```
ssh -i "ec2Access.pem" ubuntu@ec2-34-229-221-164.compute-1.amazonaws.com
```

その場合、ローカルコンピュータで以下のコマンドを実行することにより Amazon DocumentDB クラスター`sample-cluster.node.us-east-1.docdb.amazonaws.com` に SSH トンネルを設定できます。ローカルポートの転送を行う場合は、`-L` フラグを使用します。SSH トンネルを使用する場合は、クラスターエンドポイントを使用してクラスターに接続することをお勧めします。レプリカセットモード (接続文字列に `replicaSet=rs0` を指定) で接続するとエラーが発生します。

```
ssh -i "ec2Access.pem" -L 27017:sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 ubuntu@ec2-34-229-221-164.compute-1.amazonaws.com -N 
```

SSH トンネルが作成されると、`localhost:27017` に対して発行するすべてのコマンドは、Amazon VPC で実行中の Amazon DocumentDB クラスター `sample-cluster` に転送されます。Amazon DocumentDB クラスターで TLS (Transport Layer Security) が有効になっている場合は、Amazon DocumentDB の[https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) パブリックキーをダウンロードする必要があります。次のオペレーションでは、このファイルをダウンロードします。

```
wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
```

**注記**  
TLS は、新しい Amazon DocumentDB クラスターに対してデフォルトで有効になっています。ただし、無効にすることは可能です。詳細については、「[Amazon DocumentDB クラスター TLS 設定の管理](security.encryption.ssl.md#security.encryption.ssl.managing)」を参照してください。

Amazon VPC の外部から Amazon DocumentDB クラスターに接続するには、以下のコマンドを使用します。

```
mongo --sslAllowInvalidHostnames --ssl --sslCAFile global-bundle.pem --username <yourUsername> --password <yourPassword> 
```

# レプリカセットとしての Amazon DocumentDB に接続する
<a name="connect-to-replica-set"></a>

Amazon DocumentDB (MongoDB 互換）で開発する場合は、レプリカセットとしてクラスターに接続し、ドライバーに組み込まれている読み取り設定機能を使用してレプリカインスタンスに読み取りを分散することをお勧めします。このセクションでは、その意味についてさらに詳しく説明し、例として SDK for Python を使用して、レプリカセットとして Amazon DocumentDB クラスターに接続する方法について説明します。

Amazon DocumentDB には、クラスターへの接続に使用できる 3 つのエンドポイントがあります。
+ クラスターエンドポイント
+ リーダーエンドポイント
+ インスタンスエンドポイント

ほとんどの場合、Amazon DocumentDB に接続するときは、クラスターエンドポイントを使用することをお勧めします。これは、次の図に示すように、クラスター内のプライマリインスタンスをポイントする CNAME です。

SSH トンネルを使用する場合は、クラスターエンドポイントを使用してクラスターに接続することをお勧めします。レプリカセットモード (接続文字列に `replicaSet=rs0` を指定) で接続するとエラーが発生します。

**注記**  
Amazon DocumentDB ウェブサイトのエンドポイントの詳細については、「[Amazon DocumentDB エンドポイント](how-it-works.md#how-it-works.endpoints)」を参照してください。

![\[クラスター、リーダー、インスタンスのエンドポイントを含む Amazon DocumentDB エンドポイントを示す図表。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/docdb-endpoint-types.png)


クラスターエンドポイントを使用して、レプリカセットモードでクラスターに接続できます。その後、組み込まれた読み込み設定ドライバー機能を使用できます。次の例では、`/?replicaSet=rs0` を指定することで、レプリカセットとして接続することを SDK を示します。`/?replicaSet=rs0'` を省略すると、クライアントはすべてのリクエストをプライマリインスタンスであるクラスターエンドポイントにルーティングします。

```
## Create a MongoDB client, open a connection to Amazon DocumentDB as a
   ## replica set and specify the read preference as secondary preferred
   client = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0')
```

レプリカセットとして接続する利点は、インスタンスがクラスターに対して追加または削除されるタイミングを含め、SDK がクラスタートポグラフィを自動的に検出できることです。その後、レプリカインスタンスに読み込みリクエストをルーティングすることで、クラスターをより効率的に使用できます。

レプリカセットとして接続するときは、接続の `readPreference` を指定できます。`secondaryPreferred` の読み込み設定を指定した場合、クライアントは（以下の図のように）読み取りクエリをレプリカにルーティングし、書き込みクエリをプライマリインスタンスにルーティングします。これにより、クラスターリソースをより適切に利用できます。詳細については、「[読み込み設定のオプション](how-it-works.md#durability-consistency-isolation)」を参照してください。

```
## Create a MongoDB client, open a connection to Amazon DocumentDB as a
   ##   replica set and specify the read preference as secondary preferred
client = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred')
```

![\[Amazon DocumentDB readPreference: secondaryPreferred を示す図表。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/docdb-readPreference-secondaryPreferred.png)


Amazon DocumentDBレプリカからの読み込みには結果整合性があります。プライマリに書き込まれたのと同じ順序でデータを返し、50 ミリ秒未満のレプリケーション遅延もよくあります。Amazon CloudWatch メトリクス `DBInstanceReplicaLag` と `DBClusterReplicaLagMaximum` を使用して、クラスターのレプリカラグをモニタリングできます。詳細については、「[Amazon DocumentDB と CloudWatch のモニタリング](cloud_watch.md)」を参照してください。

従来のモノリシックデータベースアーキテクチャとは異なり、Amazon DocumentDB はストレージとコンピューティングを分離します。この最新のアーキテクチャでは、レプリカインスタンスの読み取りのスケールをお勧めします。レプリカインスタンスの読み込みは、プライマリインスタンスからレプリケートされる書き込みをブロックしません。クラスターに最大 15 個のリードレプリカインスタンスを追加し、1 秒あたり数百万回の読み込みにスケールアウトできます。

レプリカセットとして接続し、レプリカに読み取りを分散する主な利点は、アプリケーションの作業に利用できるクラスター内のリソース全体が増加することです。ベストプラクティスとして、レプリカセットとして接続することをお勧めします。さらに、以下のシナリオでは最も一般的にお勧めします。
+ プライマリでほぼ 100% の CPU を使用している。
+ バッファキャッシュヒット率がほぼゼロである。
+ 個別のインスタンスで接続またはカーソルの制限に達する。

クラスターインスタンスサイズのスケールアップは 1 つの選択肢であり、場合によっては、これがクラスターをスケーリングするための最良の方法です。ただし、クラスターにすでに存在するレプリカをより適切に使用する方法も考慮する必要があります。これにより、より大きいインスタンスタイプを使用することでコストが増大することなく、スケールを増加できます。また、CloudWatch アラームを使用してこれらの制限（`CPUUtilization`、`DatabaseConnections`、および `BufferCacheHitRatio`）をモニタリングおよびアラートし、リソースが頻繁に使用されているタイミングを把握することをお勧めします。

詳細については、以下の各トピックを参照してください。
+ [Amazon DocumentDB のベストプラクティス](best_practices.md)
+ [Amazon DocumentDB のクォータと制限事項](limits.md)

## クラスター接続の使用
<a name="connect-to-replica-set.utilizing-cluster-connections"></a>

クラスター内のすべての接続を使用するシナリオを検討します。たとえば、`r5.2xlarge` インスタンスの接続は 4,500 個 (および開いているカーソルは 450 個) に制限されています。3 つのインスタンスの Amazon DocumentDB クラスターを作成し、クラスターエンドポイントを使用してプライマリインスタンスにのみ接続する場合、開いている接続とカーソルのクラスター制限はそれぞれ 4,500 と 450 になります。コンテナでスピンアップする多くのワーカーを使用するアプリケーションを構築する場合、これらの制限に達する可能性があります。コンテナは、一度に多数の接続を開き、クラスターを飽和させます。

代わりに、レプリカセットとして Amazon DocumentDB クラスターに接続し、レプリカインスタンスに読み取りを分散できます。その後、クラスターで使用できる接続とカーソルの数をそれぞれ 13,500 と 1,350 に実質的に 3 倍にできます。クラスターにインスタンスを追加すると、読み取りワークロードの接続とカーソルの数が増えるだけです。クラスターへの書き込みの接続数を増やす必要がある場合は、インスタンスサイズを大きくすることをお勧めします。

**注記**  
`large` インスタンス、`xlarge` インスタンス、および `2xlarge` インスタンスの接続数は、インスタンスサイズが最大 4,500 に達するまで増加します。`4xlarge` インスタンス以上の場合、インスタンスあたりの最大接続数は 4,500 です。インスタンスタイプごとの制限の詳細については、「[インスタンス制限](limits.md#limits.instance)」を参照してください。

通常、`secondary` の読み込み設定を使用してクラスターに接続することはお勧めしません。これは、クラスターにレプリカインスタンスがない場合、読み込みが失敗するためです。例えば、1 つのプライマリと 1 つのレプリカを持つ 2 つのインスタンスの Amazon DocumentDB クラスターがあるとします。レプリカに問題がある場合、`secondary` に設定されている接続プールからの読み取りリクエストは失敗します。`secondaryPreferred` の利点は、クライアントが接続する適切なレプリカインスタンスを見つけることができない場合、読み取りのためにプライマリにフォールバックすることです。

## 複数の接続プール
<a name="connect-to-replica-set.multiple-connection-pools"></a>

シナリオによっては、アプリケーションの読み取りに、書き込み後読み取り整合性が必要です。これは、Amazon DocumentDB のプライマリインスタンスからのみ提供できます。このようなシナリオでは、2 つのクライアント接続プールを作成できます。1 つは書き込み用、もう 1 つは書き込み後読み込み整合性を必要とする読み込み用です。そのためには、コードは次のようになります。

```
## Create a MongoDB client, 
##    open a connection to Amazon DocumentDB as a replica set and specify the readPreference as primary
clientPrimary = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=primary') 
   
## Create a MongoDB client, 
##    open a connection to Amazon DocumentDB as a replica set and specify the readPreference as secondaryPreferred
secondaryPreferred = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred')
```

もう 1 つのオプションは、1 つの接続プールを作成し、特定のコレクションの読み込み設定を上書きすることです。

```
##Specify the collection and set the read preference level for that collection
col = db.review.with_options(read_preference=ReadPreference.SECONDARY_PREFERRED)
```

## 概要
<a name="connect-to-replica-set.summary"></a>

クラスター内のリソースを有効に使用するために、レプリカセットモードを使用してクラスターに接続することをお勧めします。アプリケーションに適している場合は、レプリカインスタンスに読み取りを分散することで、アプリケーションの読み取りをスケーリングできます。

# Studio 3T から Amazon DocumentDB クラスターに接続する
<a name="studio3t"></a>

[Studio 3T](https://studio3t.com/) は、MongoDB で作業するデベロッパーやデータエンジニアにとって人気のある GUI と IDE です。データのツリー、表、および JSON ビュー、CSV、JSON、SQL および BSON/MongoDump での簡単なインポート/エクスポート、柔軟なクエリオプション、視覚的なドラッグアンドドロップ UI、自動補完機能を備えた組み込みの Mongo シェル、集計パイプラインエディタ、および SQL クエリのサポートを提供しています。

## 前提条件
<a name="prerequisites"></a>
+ Amazon DocumentDB クラスターで Amazon EC2 を「踏み台ホスト」として利用するシステムをまだ構築していないお客様は、「[Amazon EC2 に接続する](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html)」の手順に従ってください。
+ Studio 3T をお持ちでない場合は、[ダウンロードしてインストールします。](https://studio3t.com/download)

## Studio 3T に接続する
<a name="connect-studio3t"></a>

1. ツールバーの左上隅にある **接続** を選択します。  
![\[左上隅にウェルカム画面と Connect オプションが強調表示されている Studio 3T インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-connect.png)

1. ツールバーの左上隅にある **新規接続** を選択します。  
![\[左上隅に新しい接続オプションが強調表示されている接続マネージャーインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-newconn.png)

1. **サーバー** タブの **サーバー** フィールドに、クラスターエンドポイント情報を入力します。  
![\[サーバー入力フィールドが強調表示されている新しい接続インターフェイスのサーバータブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-endpoint.png)
**注記**  
クラスターエンドポイントが見つからない場合。[こちらの](https://docs.aws.amazon.com/documentdb/latest/developerguide/db-instance-endpoint-find.html) ステップに従ってください。

1. **認証** タブを選択し、**認証モード** のドロップダウンメニューで **レガシー** を選択します。  
![\[レガシー認証モードが選択され、ユーザー名、パスワード、認証 DB 情報が提供された新しい接続インターフェイスの認証タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-auth.png)

1. **ユーザー名** フィールドと **パスワード** フィールドにユーザーネームと資格情報を入力します。

1. **SSL** タブを選択し、**SSLプロトコルを使用して接続する** チェックボックスをオンにします。  
![\[[SSL プロトコルを使用して接続する] が選択された新しい接続インターフェイスの SSL タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-ssl.png)

1. **独自のルート CA ファイルを使用する** を選択します。次に、Amazon DocumentDB 証明書を追加します (DocumentDB クラスターで SSL が無効になっている場合は、このステップをスキップできます)。**無効なホスト名** を許可するには、チェックボックスをオンにします。  
![\[ルート CA ファイルが入力され、[無効なホスト名を許可する] が選択された新しい接続インターフェイスの SSL タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-ssl.png)
**注記**  
証明書を持っていない場合。次のコマンドでダウンロードできます。  
 `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem ` 

1. Amazon VPC 外のクライアントマシンから接続する場合は、SSH トンネルを作成する必要があります。**SSH** タブでこれを行います。

   1. **SSHトンネルを使用する** のチェックボックスをオンにして、**SSHアドレス** フィールドに SSH アドレスを入力します。これはインスタンスの公開 DNS (IPV4) です。この URL は [Amazon EC2 マネジメントコンソール](https://console.aws.amazon.com/ec2) から取得できます。

   1. ユーザーネームを入力します。これは Amazon EC2 インスタンスのユーザーネームです。

   1. **SSH 認証モード**で、**プライベートキー** を選択します。**プライベートキー** フィールドで、ファイルファインダーアイコンを選択し、Amazon EC2 インスタンスのプライベートキーを選択します。これは、Amazon EC2 コンソールでインスタンスを作成するときに保存した.pem ファイル（キーペア）です。

   1. Linux/macOS クライアントマシンを使用している場合は、次のコマンドを使用してプライベートキーの許可を変更する必要があることがあります。

      `chmod 400 /fullPathToYourPemFile/<yourKey>.pem`  
![\[SSH トンネル認証情報が入力された新しい接続インターフェイスの SSH タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-ssh.png)
**注記**  
この Amazon EC2 インスタンスは、DocumentDB クラスターと同じ Amazon VPC およびセキュリティグループ内に存在する必要があります。SSH アドレス、ユーザーネーム、プライベートキーは、[Amazon EC2 マネジメントコンソール](https://console.aws.amazon.com/ec2) から取得できます。

1. 次に **接続のテスト** ボタンを選択して構成をテストします。  
![\[左下隅に [接続のテスト] ボタンが強調表示されている新しい接続インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-testbutton.png)

1. 診断ウィンドウには、テストが成功したことを示す緑色のバーがロードされます。次に **OK** を選択して、診断ウィンドウを閉じます。  
![\[接続テストが成功した後に表示される診断ウィンドウ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-testconn.png)

1. **保存** を選択して、将来使用するために接続を保存します。  
![\[[保存] ボタンが強調表示されている新しい接続インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-save.png)

1. 次にクラスターを選択し、**接続** を選択します。  
![\[[接続] ボタンが強調表示されている [接続マネージャー] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/studio3t/studio3t-finalconnect.png)

お疲れ様でした。Studio 3T を介して Amazon DocumentDB クラスターに正常に接続されました。

# DataGrip を使用して Amazon DocumentDB に接続する
<a name="data-grip-connect"></a>

[DataGrip](https://www.jetbrains.com/help/datagrip/documentdb.html) は、Amazon DocumentDB を含むさまざまなデータベースシステムをサポートする強力な統合開発環境 (IDE) です。このセクションでは、DataGrip を使用して Amazon DocumentDB クラスターに接続する手順を説明します。これにより、グラフィカルインターフェイスを使用してデータを簡単に管理およびクエリできます。

## 前提条件
<a name="data-grip-prerequisites"></a>
+ DataGrip IDE がマシンにインストールされています。[JetBrains](https://www.jetbrains.com/datagrip/download/#section=windows) からダウンロードできます。
+ Amazon DocumentDB クラスターと同じ VPC で実行中の Amazon EC2 インスタンス。このインスタンスを使用して、ローカルマシンから Amazon DocumentDBCluster までの安全なトンネルを確立します。[Amazon EC2 を使用した接続](connect-ec2.md) 方法に関する指示に従ってください。
+ Amazon EC2 インスタンス、VPN 接続の代替、または安全な VPN AWS を使用してインフラストラクチャに既にアクセスしている場合。このオプションを希望する場合は、指示に従って AWS Client VPN を使用して [Amazon DocumentDB に安全にアクセスしてください](https://aws.amazon.com/blogs/database/securely-access-amazon-documentdb-with-mongodb-compatibility-locally-using-aws-client-vpn/)。

## DataGrip を使用して接続する
<a name="data-grip-connect-steps"></a>

1. コンピューターで DataGrip を起動し、**[新しいプロジェクト]**を作成します。  
![\[新しいプロジェクトオプションが強調表示された DataGrip ウェルカム画面。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/welcome.png)

1. 以下のいずれかの方法を使用して、新しいデータソースを追加します。

   1. メインメニューから** [ファイル]-[新規]-[データソース]** に移動し、**[DocumentDB]** を選択します。

   1. **[データベースエクスプローラー]**で、ツールバーの新規アイコン (**\$1**) をクリックします。**[データソース]** に移動し、**[DocumentDB]** を選択します。  
![\[+ のドロップダウンリストには、データソースサブメニューが表示されます。DocumentDB はそのサブメニューから選択されます。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/explorer.png)

1. **[全般]** タブの **[データソース]** ページで、接続設定領域の下部に **[見つからないドライバファイルのダウンロード]** リンクがあるかどうかを確認します。このリンクをクリックして、データベースとの通信に必要なドライバーをダウンロードします。直接ダウンロードリンクについては、[JetBrains JDBC ドライバー](https://www.jetbrains.com/datagrip/jdbc-drivers/)を参照してください。  
![\[欠落しているドライバーファイルのリンクが強調表示されたデータソースとドライバーインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/missing-driver.png)

1. **[一般]** タブで、接続の詳細を指定します。

   1. **[ホスト]** フィールドで、Amazon DocumentDB クラスターエンドポイントを指定します。

   1. **[ポート]** は既に 27017 に設定されています。クラスターが別のポートにデプロイされている場合は変更してください。

   1. **[認証]** で、**[ユーザーとパスワード]** を選択します。

   1. 自分のユーザー名とパスワードを入力します。

   1. **[データベース]** フィールドはオプションです。接続先のデータベースを指定できます。

   1. 上記の詳細を追加すると、**[URL]** フィールドが自動補完されます。  
![\[データソースとドライバーインターフェイスの全般タブのホスト、ポート、認証、データベース、URL フィールド。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/connection.png)

1. **[SSH/SSL]** タブで **[SSH トンネルを使用する]** を有効にし、アイコンをクリックして **[SSH 設定]** ダイアログを開きます。次の情報を入力します。

   1. **[ホスト]** フィールドに、Amazon EC2 インスタンスのホスト名を入力します。

   1. Amazon EC2 インスタンスのユーザーネームとパスワードを入力します。

   1. **[認証タイプ]** で、**[キーペア]** を選択します。

   1. **[プライベートキーファイル]** を入力します。
**注記**  
VPN オプションを使用している場合は、SSH トンネルを設定する必要はありません。  
![\[[SSH トンネルの使用] が選択され、SSH 設定アイコンが強調表示されているデータソースとドライバーインターフェイスの SSH/SSL タブ。アイコンをクリックすると、表示された SSH 設定インターフェイスが開きます。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ssh-tunnel.png)

1. **[SSH/SSL]** タブで、**[SSL を使用する]** を有効にします。**[CA ファイル]** フィールドに、`global-bundle.pem` コンピューター上のファイルの場所を入力します。**[モード]** は **[必須]** オプションのままにしておきます。
**注記**  
証明書は次の場所からダウンロードするか、wget[https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) コマンドを使用してダウンロードできます。
**注記**  
Amazon DocumentDB エラスティッククラスターに接続する場合、CA ファイルを指定する必要はありません。**[SSLを使用する]** オプションはオンのままにして、他のすべてのオプションはデフォルト値のままにします。  
![\[SSL 設定が有効になっているデータソースとドライバーインターフェイスの SSH/SSL タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/use-ssl.png)

1. **[スキーマ]** タブの **[すべてのデータベース]** を選択するか、**[スキーマパターン]** フィールドに「\$1: \$1」というフィルターを入力します。**[接続テスト]** リンクをクリックして接続をテストします。  
![\[すべてのデータベースオプションが選択されているデータソースとドライバーインターフェイスのスキーマタブ。テスト接続リンクの上に成功メッセージが表示されます。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/schemas.png)

1. 接続が正常にテストされたら、**[OK]** をクリックしてデータソース設定を保存します。

## DataGrip の機能
<a name="data-grip-features"></a>

DataGrip には Amazon DocumentDB を使用して効率的に作業するためのさまざまな機能が用意されています。
+ **SQL エディター** — DataGrip の SQL エディターを使用してDocumentDB コレクションに SQL のようなクエリを記述して実行します。
+ **ビジュアルクエリビルダー** — ビジュアルクエリビルダーを使用すると、SQL コードを記述せずにグラフィカルにクエリを作成できます。
+ **スキーマ・マネジメント** — コレクションの作成、変更、削除など、データベーススキーマを簡単に管理できます。
+ **データ・ビジュアライゼーション** — DataGrip のさまざまな視覚化ツールを使用して、データを表示および分析します。
+ **データのエクスポートとインポート** — DataGrip のエクスポートおよびインポート機能を使用して、Amazon DocumentDB と他のデータベース間でデータを転送します。

Amazon DocumentDB やその他のデータベースシステムの操作に関するより高度な機能やヒントについては、公式 [DataGrip ドキュメント](https://www.jetbrains.com/datagrip/features/)を参照してください。

# Amazon EC2 を使用した接続
<a name="connect-ec2"></a>

このセクションでは、Amazon DocumentDB クラスターと Amazon EC2 間の接続を設定し、Amazon EC2 インスタンスから Amazon DocumentDB クラスターにアクセスする方法について説明します。

EC2 接続を設定する方法は複数あります。
+ [EC2 インスタンスを Amazon DocumentDB データベースに自動的に接続する](connect-ec2-auto.md) — EC2 コンソールの自動接続機能を使用して、EC2 インスタンスと新規または既存の Amazon DocumentDB データベース間の接続を自動で設定できます。この接続により、EC2 インスタンスと Amazon DocumentDB データベース間でやり取りされるトラフィックを確立できます。このオプションは通常、新しいセキュリティグループのテストと作成に使用されます。
+ [EC2 インスタンスを Amazon DocumentDB データベースに手動で接続する](connect-ec2-manual.md) — 自動接続機能によって作成されるのと同じ設定を再現することにより、セキュリティグループを手動で設定して割り当て、EC2 インスタンスと Amazon DocumentDB データベース間の接続を設定できます。このオプションは、通常、高度な設定を変更したり、既存のセキュリティグループを使用するために使用されます。

## 前提条件
<a name="connect-ec2-prerequisites"></a>

いずれのオプションを使用する場合でも、最初の Amazon DocumentDB クラスターを作成する前に、以下の操作を行う必要があります。

**Amazon Web Services (AWS) アカウントを作成する**  
Amazon DocumentDB を使用する前に、Amazon Web Services (AWS) アカウントを持っている必要があります。 AWS アカウントは無料です。使用しているサービスとリソースに対してのみ料金をお支払いいただきます。  
がない場合は AWS アカウント、次の手順を実行して作成します。  

**にサインアップするには AWS アカウント**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup) を開きます。

1. オンラインの手順に従います。

   サインアップ手順の一環として、電話またはテキストメッセージを受け取り、電話キーパッドで検証コードを入力します。

   にサインアップすると AWS アカウント、 *AWS アカウントのルートユーザー* が作成されます。ルートユーザーには、アカウントのすべての AWS のサービス とリソースへのアクセス権があります。セキュリティベストプラクティスとして、ユーザーに管理アクセス権を割り当て、[ルートユーザーアクセスが必要なタスク](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)の実行にはルートユーザーのみを使用するようにしてください。

**必要に応じて、必要な AWS Identity and Access Management (IAM) アクセス許可を設定します。**  
クラスター、インスタンス、クラスターパラメータグループなどの Amazon DocumentDB リソースを管理するには、 がリクエストの認証 AWS に使用できる認証情報が必要です。詳細については、「[Amazon DocumentDB の Identity and Access Management](security-iam.md)」を参照してください。  

1. の検索バーで AWS マネジメントコンソール、IAM と入力し、表示されるドロップダウンメニューで **IAM** を選択します。

1. IAM コンソールにアクセスしたら、ナビゲーションペインから [**ユーザー**] を選択します。

1. ユーザーネームを選択します。

1. [**アクセス許可の追加**] ボタンをクリックします。

1. [**Attach existing policies directly ( 既存のポリシーを直接アタッチ )**] を選択します。

1. 検索バーに `AmazonDocDBFullAccess` と入力し、検索結果に表示されたら、それを選択します。

1. [**Next: レビュー**] と表示されている青いボタンをクリックします。

1. [**アクセス許可の追加**] となっている下の青いボタンをクリックします。

**Amazon VPC (Amazon Virtual Private Cloud) を作成する**  
どの AWS リージョン にあるかによって、デフォルトの VPC が既に作成されているかどうかがわかります。デフォルトの VPC がない場合は、[Amazon VPC のユーザーガイド](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html) の *Amazon VPC の開始方法* のステップ 1 を完了させます。これには 5 分もかかりません。

# Amazon EC2 への自動接続
<a name="connect-ec2-auto"></a>

**Topics**
+ [EC2 インスタンスを新しい Amazon DocumentDB データベースに自動接続する](#auto-connect-ec2.process)
+ [EC2 インスタンスを既存の Amazon DocumentDB データベースに自動的に接続する](#auto-connect-ec2-existing-cluster)
+ [EC2 インスタンスとの自動接続の概要](#auto-connect-ec2.overview)
+ [接続中のコンピューティングリソースを表示する](#auto-connect-ec2.compute)

EC2 インスタンスと新しい Amazon DocumentDB データベース間の接続を設定する前に、「[EC2 インスタンスとの自動接続の概要](#auto-connect-ec2.overview)」に記載される要件を満たしているか確認してください。接続の設定後にこれらのセキュリティグループに変更を加えると、EC2 インスタンスと Amazon DocumentDB データベース間の接続に影響を及ぼす可能性があります。

**注記**  
 AWS マネジメントコンソールを使用することでのみ、EC2 インスタンスと Amazon DocumentDB データベース間の接続を自動的に設定できます。 AWS CLI または Amazon DocumentDB API を使用して接続を自動的にセットアップすることはできません。

## EC2 インスタンスを新しい Amazon DocumentDB データベースに自動接続する
<a name="auto-connect-ec2.process"></a>

以下のプロセスは、[前提条件](connect-ec2.md#connect-ec2-prerequisites) トピック記載のステップが完了済みであることを前提としています。

**Topics**
+ [ステップ 1: Amazon EC2 インスタンスを作成する](#auto-connect-ec2.launch-ec2-instance)
+ [ステップ 2: Amazon DocumentDB クラスターを作成する](#auto-connect-ec2.launch-cluster)
+ [ステップ 3: Amazon EC2 インスタンスに接続する](#manual-connect-ec2.connect)
+ [ステップ 4: MongoDB シェルをインストールする](#auto-connect-ec2.install-mongo-shell)
+ [ステップ 5: Amazon DocumentDB TLS の管理](#auto-connect-ec2.tls)
+ [ステップ 6: Amazon DocumentDB クラスターに接続する](#auto-connect-ec2.connect-use)
+ [ステップ 7: データの挿入とクエリ](#auto-cloud9-insert-query)
+ [ステップ 8: 使ってみる](#auto-connect-ec2.explore)

### ステップ 1: Amazon EC2 インスタンスを作成する
<a name="auto-connect-ec2.launch-ec2-instance"></a>

このステップでは、後で Amazon DocumentDB クラスターのプロビジョニングに使用するのと同じリージョンと Amazon VPC に Amazon EC2 インスタンスを作成します。

1. Amazon EC2 コンソールで、[**インスタンスを起動**] を選択します。  
![\[Amazon EC2 コンソールの [インスタンスを起動] セクション。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/launch-instance.png)

1. **[名前とタグ]** セクション内の **[名前]** フィールドに、名前または識別子を入力します。

1. **[Amazon マシンイメージ (AMI)]** ドロップダウンリストで、**[Amazon Linux 2 AMI]** を選択します。  
![\[Amazon Linux 2 AMI オプションが [クイックスタート] セクションで選択された [アプリケーションおよび OS イメージ] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/linux2-ami.png)

1. **[インスタンスタイプ]** のドロップダウンリストで、**[t3.micro]** を選択します。

1. **[キーペア (ログイン)]** セクションで、既存のキーペアの識別子を入力するか、もしくは **[新しいキーペアの作成]** を選択します。  
![\[キーペア名フィールドと新しいキーペアの作成オプションを示す [キーペア] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/key-pair.png)

   Amazon EC2 キーペアを指定する必要があります。
   + Amazon EC2 のキーペアがある場合 :

     1. キーペアを選択し、リストからご自身のキーペアを選択します。

     1. Amazon EC2 インスタンスにログインするには、あからじめプライベートキーファイル (.pem もしくは.ppk ファイル) を利用可能にしておく必要があります。
   + Amazon EC2 のキーペアがない場合:

     1. **[新しいキーペアの作成]** を選択すると、**[キーペアの作成]** ダイアログボックスが表示されます。

     1. **[キーペア名]** フィールドに名前を入力します。

     1. **[キーペアタイプ]** と **[プライベートキーファイル形式]** を選択します。

     1. [**キーペアの作成**] を選択してください。  
![\[キーペア名、タイプ、ファイル形式がある [キーペアの作成] インターフェイス。[キーペアの作成] ボタンは右下隅にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/create-key-pair.png)
**注記**  
セキュリティ上の理由から、SSH とインターネット両方からの EC2 インスタンスへの接続にキーペアを使用することを強くお勧めします。

1. **オプション:** **ネットワーク設定セクション** の **ファイアウォール (セキュリティグループ)** で、[**セキュリティグループの作成**] を選択します。  
![\[セキュリティグループを作成するためのオプションを示す [ネットワーク設定] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/firewall.png)

   **[セキュリティグループの作成]** を選択します (EC2 接続に適用されるすべてのトラフィック許可ルールを確認します)。
**注記**  
既存のセキュリティグループを使用する場合は、「[Amazon EC2 を手動で接続する](connect-ec2-manual.md)」の手順に従います。

1. **[概要]** セクションで、EC2 設定を確認し、問題がなければ **[インスタンスを起動]** を選択します。

### ステップ 2: Amazon DocumentDB クラスターを作成する
<a name="auto-connect-ec2.launch-cluster"></a>

Amazon EC2 インスタンスのプロビジョニング中は、Amazon DocumentDB クラスターを作成します。

1. Amazon DocumentDB コンソールに移動し、ナビゲーションペインから **クラスター** を選択します。

1. **[作成]** を選択します。

1. **[クラスタータイプ]** 設定は、デフォルトの **[インスタンスベースのクラスター]** のままにしておきます。

1. **[クラスター設定]** では、一意の **[クラスター名]** を入力します。コンソール操作では、入力方法に関係なくクラスター名のすべての文字が小文字に変換されることにご留意ください。

   **[エンジンバージョン]** はデフォルト値の **5.0.0** のままにします。

1. **[クラスターストレージ設定]** では、**Amazon DocumentDB Standard** のデフォルト設定のままにします。

1. **[インスタンスの設定]** で:
   + **[DB インスタンスクラス]** では、**メモリ最適化クラス (r クラスを含む) ** を選択します (デフォルト）。

     もう 1 つのインスタンスオプションは **NVMe-backed クラス** です。詳細については [NVMe-backed インスタンス](db-instance-nvme.md) を参照してください。
   + **[インスタンスクラス]** では、ニーズに合ったインスタンスタイプを選択します。インスタンスクラスの詳細については、「[インスタンスクラスの仕様](db-instance-classes.md#db-instance-class-specs)」を参照してください。
   + **[インスタンスの数]** では、ニーズを最も反映する数を選択します。数値が低いほど、コストが低くなり、クラスターで管理できる読み取り/書き込みボリュームが低くなることに注意してください。  
![\[インスタンス数が 1 に設定されている、クラスター識別子、エンジンバージョン、およびインスタンスクラスのデフォルト値がある設定インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/create-cluster/instance-config.png)

1. **[接続]** で、**[EC2 コンピューティングリソースに接続する]** を選択します。これは、ステップ 1 で作成した EC2 インスタンスです。  
![\[選択した EC2 コンピューティングリソースへの接続オプションがある接続インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2-connect.png)
**注記**  
EC2 コンピューティングリソースに接続すると、Amazon DocumentDB クラスターへの EC2 コンピューティングリソース接続向けセキュリティグループが自動的に作成されます。クラスターの作成完了後、新しく作成したセキュリティグループを確認したい場合は、クラスターリストに移動して該当するクラスター識別子を選択します。**[接続とセキュリティ]** タブ内で **[セキュリティグループ]** に移動して、**[セキュリティグループ名 (ID)]** で見たいグループを見つけます。クラスターの名前と `docdb-ec2-docdb-2023-12-11-21-33-41:i-0e4bb09985d2bbc4c (sg-0238e0b0bf0f73877)` のような内容が表示されます。

1. **[認証]** セクションで、プライマリユーザーのユーザー名を入力し、**[セルフマネージド]** を選択します。パスワードを入力して確認します。

   代わりに **Managed in AWS Secrets Manager** を選択した場合、詳細については[Amazon DocumentDB と によるパスワード管理 AWS Secrets Manager](docdb-secrets-manager.md)「」を参照してください。

1. **[クラスターを作成]** を選択します。

### ステップ 3: Amazon EC2 インスタンスに接続する
<a name="manual-connect-ec2.connect"></a>

Mongo Shell をインストールするには、まず Amazon EC2 インスタンスに接続する必要があります。Mongo シェルをインストールすると、Amazon DocumentDB クラスターに接続してクエリを実行できます。以下のステップを実行します。

1. Amazon EC2 コンソールで、インスタンスに移動し、作成したインスタンスが実行中かどうかを確認します。実行されている場合は、インスタンス ID をクリックしてインスタンスを選択します。  
![\[Amazon EC2 コンソールで 2 つのインスタンスを一覧表示するインスタンステーブル。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/ec2-instance-table.png)

1. **接続** を選択します。  
![\[Amazon EC2 インスタンスのインスタンス概要。[接続] ボタンは右上隅にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/ec2-instance-summary.png)

1. 接続方法として、Amazon EC2 Instance Connect、セッションマネージャー、SSH クライアント、EC2 シリアルコンソールの 4 つのオプションがタブ形式で表示されます。いずれかを選択し、その指示に従わなければなりません。完了したら、**[接続する]** を選択します。  
![\[EC2 Instance Connect の接続方法の設定オプションを示すインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/connect-options.png)

**注記**  
このチュートリアルの開始後に IP アドレスが変更された場合、または後で環境に戻る場合は、`demoEC2` セキュリティグループのインバウンドルールを更新して、新しい API アドレスからのインバウンドトラフィックを有効化します。

### ステップ 4: MongoDB シェルをインストールする
<a name="auto-connect-ec2.install-mongo-shell"></a>

これで、MongoDB シェルをインストールできます。これは、Amazon DocumentDB クラスターに接続してクエリするために使用するコマンドラインのユーティリティです。現在、MongoDB シェルには最新バージョンの mongosh と以前のバージョンの mongo シェルの 2 つのバージョンがあります。

**重要**  
なお、バージョン 6.13.1 より前の Node.js ドライバーには既知の制限事項があり、現在 Amazon DocumentDB の IAM ID 認証ではサポートされていません。Node.js ドライバーを使用する Node.js ドライバーとツール (例えば、mongosh) は、Node.js ドライバーバージョン 6.13.1 以降を使用するようにアップグレードする必要があります。

以下の手順に従って、オペレーションシステム用の MongoDB シェルをインストールします。

------
#### [ On Amazon Linux ]

**Amazon Linux で MongoDB シェルをインストールするには**

IAM 認証を使用して*おらず*、最新の MongoDB シェル (mongosh) を使用して Amazon DocumentDB クラスターに接続する場合は、次の手順に従います。

1. リポジトリファイルを作成します。作成した EC2 インスタンスのコマンドラインで、次のコマンドを入力します。

   ```
   echo -e "[mongodb-org-5.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/5.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://pgp.mongodb.com/server-5.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-5.0.repo
   ```

1. 完了したら、コマンドプロンプトで次の 2 つのコマンドオプションのいずれかを使用して mongosh をインストールします。

   **オプション 1** — Amazon EC2 の設定中にデフォルトの Amazon Linux 2023 を選択した場合は、次のコマンドを入力します。

   ```
   sudo yum install -y mongodb-mongosh-shared-openssl3
   ```

   **オプション 2** — Amazon EC2 の設定中に Amazon Linux 2 を選択した場合は、次のコマンドを入力します。

   ```
   sudo yum install -y mongodb-mongosh
   ```

IAM 認証を使用している場合は、以前のバージョンの MongoDB シェル (5.0) を使用して Amazon DocumentDB クラスターに接続する必要があり、次の手順を実行します。

1. リポジトリファイルを作成します。作成した EC2 インスタンスのコマンドラインで、次のコマンドを入力します。

   ```
   echo -e "[mongodb-org-5.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/5.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://pgp.mongodb.com/server-5.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-5.0.repo
   ```

1. 完了したら、コマンドプロンプトで次のコマンドオプションを使用して mongodb 5.0 シェルをインストールします。

   ```
   sudo yum install -y mongodb-org-shell
   ```

------
#### [ On Ubuntu ]

**Ubuntu に mongosh をインストールするには**

1. パッケージ管理システムで使用されるパブリックキーをインポートします。

   ```
   curl -fsSL https://pgp.mongodb.com/server-5.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-5.0.gpg
   ```

1. Ubuntu のバージョンに適切なコマンドを使用して、MongoDB の リストファイル `mongodb-org-5.0.list` を作成します。

   ```
   echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-5.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
   ```

1. 次のコマンドを使用してローカルパッケージデータベースをインポートして更新します。

   ```
   sudo apt-get update
   ```

1. mongosh をインストールします。

   ```
   sudo apt-get install -y mongodb-mongosh
   ```

以前のバージョンの MongoDB の Ubuntu システムへのインストールについては、「 [Install MongoDB Community Edition on Ubuntu](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/) 」を参照してください。

------
#### [ On other operating systems ]

mongo シェルを他のオペレーティングシステムにインストールするには、MongoDB ドキュメントの「 [MongoDB Community Edition のインストール](https://www.mongodb.com/docs/manual/administration/install-community/) 」を参照してください。

------

### ステップ 5: Amazon DocumentDB TLS の管理
<a name="auto-connect-ec2.tls"></a>

次のコード `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem` を使用して Amazon DocumentDB の CA 証明書をダウンロードします。

**注記**  
全ての新しい Amazon DocumentDB クラスターに対して、デフォルトで Transport Layer Security (TLS) が有効になっています。詳細については、「[Amazon DocumentDB クラスター TLS 設定の管理](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html)」を参照してください。

### ステップ 6: Amazon DocumentDB クラスターに接続する
<a name="auto-connect-ec2.connect-use"></a>

1. Amazon DocumentDB コンソールの **[クラスター]** で、接続したいクラスターを見つけます。そのクラスターの **[クラスター識別子]** をクリックして、作成済みのクラスターを選択します。

1. **[接続とセキュリティ]** タブの **[接続する]** ボックス内で、**[mongo シェルを使用してこのクラスターに接続する]** を見つけます。  
![\[Mongo シェルを使用して Amazon DocumentDB クラスターに接続するための Amazon DocumentDB 接続文字列が強調表示されたクラスター接続設定。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/connect-mongosh.png)

   表示された接続文字列をコピーし、ターミナルに貼り付けます。

   これに以下の変更を加えます。

   1. 文字列に正しいユーザー名が含まれているのを確認してください。

   1. `<insertYourPassword>` は省略します。これにより、接続時に mongo シェルによりパスワードの入力を求められます。

   1. オプション: IAM 認証を使用している場合、または以前のバージョンの MongoDB シェルを使用している場合は、次のように接続文字列を変更します。

      `mongo --ssl --host mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1.docdb.amazonaws.com:27017 --sslCAFile global-bundle.pem --username SampleUser1 --password`

      `mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1` をクラスターの同じ情報に置き換えます。

1. ターミナル上で Enter キーを押します。ここで、パスワードの入力を求められます。パスワードを入力します。

1. パスワードを入力し、`rs0 [direct: primary] <env-name>>` プロンプトが表示されたら、Amazon DocumentDB クラスターに正常に接続されています。

接続に問題がありますか。[Amazon DocumentDB のトラブルシューティング](https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html) を参照してください。

### ステップ 7: データの挿入とクエリ
<a name="auto-cloud9-insert-query"></a>

クラスターに接続できたので、いくつかのクエリを実行して、ドキュメントデータベースの使用に慣れることができます。

1. 1 つのドキュメントを挿入するには、次のように入力します。

   ```
   db.collection.insertOne({"hello":"DocumentDB"})
   ```

   次の出力が返ります。

   ```
   {
     acknowledged: true,
     insertedId: ObjectId('673657216bdf6258466b128c')
   }
   ```

1. `findOne()` コマンドで書き込んだドキュメントを読み取ることができます (一つのドキュメントしか返さないため)。以下を入力します。

   ```
   db.collection.findOne()
   ```

   次の出力が返ります。

   ```
   { "_id" : ObjectId("5e401fe56056fda7321fbd67"), "hello" : "DocumentDB" }
   ```

1. さらにいくつかのクエリを実行するには、ゲームプロファイルのユースケースを検討してください。まず、「`profiles`」というタイトルのコレクションにエントリをいくつか挿入します。以下を入力します。

   ```
   db.profiles.insertMany([{ _id: 1, name: 'Matt', status: 'active', level: 12, score: 202 }, 
         { _id: 2, name: 'Frank', status: 'inactive', level: 2, score: 9 }, 
         { _id: 3, name: 'Karen', status: 'active', level: 7, score: 87 }, 
         { _id: 4, name: 'Katie', status: 'active', level: 3, score: 27 }
   ])
   ```

   次の出力が返ります。

   ```
   { acknowledged: true, insertedIds: { '0': 1, '1': 2, '2': 3, '3': 4 } }
   ```

1. `find()` コマンドを使用して、プロファイルコレクション内のすべてのドキュメントを返します。以下を入力します。

   ```
   db.profiles.find()
   ```

   ステップ 3 で入力したデータと一致する出力を取得します。

1. フィルターを使用して 1 つのドキュメントに対して1つのクエリを使用します。以下を入力します。

   ```
   db.profiles.find({name: "Katie"})
   ```

   次の出力が返ります。

   ```
   { "_id" : 4, "name" : "Katie", "status": "active", "level": 3, "score":27}
   ```

1. それでは、プロファイルを探して、それを `findAndModify` コマンドで変更してみましょう。次のコードを使用して、ユーザー Matt に 10 ポイント追加します。

   ```
   db.profiles.findAndModify({
           query: { name: "Matt", status: "active"},
           update: { $inc: { score: 10 } }
       })
   ```

   次のような出力が得られます (Mattのスコアはまだ上がっていないことに注意してください) 。

   ```
   {
       [{_id : 1, name : 'Matt', status: 'active', level: 12, score: 202}]
   ```

1. 次のクエリを使用して、Matt のスコアが変更されたことを確認できます。

   `db.profiles.find({name: "Matt"})`

   次の出力が返ります。

   ```
   { "_id" : 1, "name" : "Matt", "status" : "active", "level" : 12, "score" : 212 }
   ```

### ステップ 8: 使ってみる
<a name="auto-connect-ec2.explore"></a>

お疲れ様でした。Amazon DocumentDB のクイックスタートガイドを正常に完了しました。

次のステップ この強力なデータベースを一般的な特徴をいくつか使って十分に活用する方法を学びましょう。
+  [Amazon DocumentDB の管理](https://docs.aws.amazon.com/documentdb/latest/developerguide/managing-documentdb.html) 
+  [スケーリング](https://docs.aws.amazon.com/documentdb/latest/developerguide/operational_tasks.html) 
+  [バックアップと復元](https://docs.aws.amazon.com/documentdb/latest/developerguide/backup_restore.html) 

**注記**  
コストを節約するために、Amazon DocumentDB クラスターを停止してコストを削減するか、クラスターを削除することができます。デフォルトでは、30 分間非アクティブになると、 AWS Cloud9 環境は基盤となる Amazon EC2 インスタンスを停止します。

## EC2 インスタンスを既存の Amazon DocumentDB データベースに自動的に接続する
<a name="auto-connect-ec2-existing-cluster"></a>

次の手順では、既存の Amazon DocumentDB クラスターと既存の Amazon EC2 インスタンスを利用できることを前提としています。

**Amazon DocumentDB クラスターにアクセスし、Amazon EC2 接続をセットアップする**

1. Amazon DocumentDB クラスターにアクセスします。

   1. にサインインし AWS マネジメントコンソール、[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb) で Amazon DocumentDB コンソールを開きます。

   1. ナビゲーションペインで **クラスター** を選択します。
**ヒント**  
画面の左側にナビゲーションペインが表示されない場合は、ページの左上隅にあるメニューアイコン (![\[Hamburger menu icon with three horizontal lines.\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/docdb-menu-icon.png)) を選択します。

   1. クラスター名の左側にあるボタンを選択して、アクセスしたいクラスターを指定します。

1. Amazon EC2 接続を設定します。

   1. **[アクション]** をクリックし、**[EC2 接続の設定]** をクリックします。  
![\[[EC2 接続のセットアップ] オプションが選択された [アクション] ドロップダウンリスト。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/setup-ec2-connect.png)

      **[EC2 接続の設定]** ダイアログが開きます。

   1. **[EC2 インスタンス]** フィールドで、クラスターに接続する EC2 インスタンスを選択します。  
![\[[EC2 インスタンス] ドロップダウンリストが強調表示された [EC2 接続のセットアップ] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/setup-ec2-connect-dialog.png)

   1. [**続行**] をクリックしてください。

      **[確認と確定]** ダイアログページが表示されます。

   1. 変更内容が正しいことを確認します。続いて、**[接続の設定]** を選択します。  
![\[変更の概要を示す [確認と確定] インターフェイス。[接続の設定] ボタンは右下隅にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/setup-ec2-review-confirm.png)

正常に接続が設定されると、以下の検証結果が表示されます。

![\[Amazon DocumentDB データベースと EC2 インスタンス間の接続設定が成功したことの確認メッセージ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/setup-ec2-connect-success.png)


## EC2 インスタンスとの自動接続の概要
<a name="auto-connect-ec2.overview"></a>

EC2 インスタンスと Amazon DocumentDB データベース間の接続を設定すると、Amazon DocumentDB ではその EC2 インスタンスと Amazon DocumentDB データベース向けの VPC セキュリティグループを自動的に設定します。

EC2 インスタンスと Amazon DocumentDB データベースを接続するための要件は次のとおりです。
+ EC2 インスタンスは、Amazon DocumentDB データベースと同じ VPC 内に存在する必要があります。

  同じ VPC に EC2 インスタンスが存在しない場合、コンソールには EC2 インスタンス作成用のリンクが表示されます。
+ 接続を設定するユーザーには、以下の Amazon EC2 オペレーションを実行するアクセス許可が必要です。
  + `ec2:AuthorizeSecurityGroupEgress`
  + `ec2:AuthorizeSecurityGroupIngress`
  + `ec2:CreateSecurityGroup`
  + `ec2:DescribeInstances`
  + `ec2:DescribeNetworkInterfaces`
  + `ec2:DescribeSecurityGroups`
  + `ec2:ModifyNetworkInterfaceAttribute`
  + `ec2:RevokeSecurityGroupEgress`

DB インスタンスと EC2 インスタンスが異なるアベイラビリティーゾーンにある場合、アベイラビリティーゾーン間のコストが発生する可能性があります。

EC2 インスタンスへの接続を設定すると、Amazon DocumentDB は、次の表に示すように、その Amazon DocumentDB データベースと EC2 インスタンスに関連付けられているセキュリティグループの現在の設定に従って動作します。


| 現在の Amazon DocumentDB セキュリティグループ設定 | 現在の EC2 セキュリティグループの設定 | Amazon DocumentDB の動作 | 
| --- | --- | --- | 
| パターン DocumentDB-ec2-n に一致する名前をもつ Amazon DocumentDB データベースに関連付けられたセキュリティグループが 1 つ以上存在します。パターンに一致するセキュリティグループは変更されていません。このセキュリティグループには、EC2 インスタンスの VPC セキュリティグループをソースとするインバウンドルールが 1 つのみ存在します。 | パターン DocumentDB-ec2-n (n は数字) に一致する名前の EC2 インスタンスに関連付けられたセキュリティグループが 1 つ以上存在します。パターンに一致するセキュリティグループは変更されていません。このセキュリティグループには、Amazon DocumentDB データベースの VPC セキュリティグループをソースとするアウトバウンドルールが 1 つのみ存在します。 | Amazon DocumentDB はアクションを実行しません。EC2 インスタンスと Amazon DocumentDB データベース間の接続は、既に自動で設定されています。EC2 インスタンスと Amazon DocumentDB データベース間には既に接続が存在するため、セキュリティグループの変更は行われません。 | 
| 次の条件のいずれかが適用されます。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/connect-ec2-auto.html)  | 次の条件のいずれかが適用されます。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/connect-ec2-auto.html) | Amazon DocumentDB アクション: 新しいセキュリティグループを作成する | 
| パターン DocumentDB-ec2-n に一致する名前をもつ Amazon DocumentDB データベースに関連付けられたセキュリティグループが 1 つ以上存在します。パターンに一致するセキュリティグループは変更されていません。このセキュリティグループには、EC2 インスタンスの VPC セキュリティグループをソースとするインバウンドルールが 1 つのみ存在します。 | EC2 インスタンスに関連付けられた、パターン ec2-DocumentDB-n に一致する名前のセキュリティグループが 1 つまたは複数存在します。ただし、Amazon DocumentDB は、これらのセキュリティグループのいずれも、Amazon DocumentDB データベースとの接続には使用できません。Amazon DocumentDB は、Amazon DocumentDB データベースの VPC セキュリティグループをソースとするアウトバウンドルールが 1 つもないセキュリティグループを使用できません。また、Amazon DocumentDB は、変更が加えられたセキュリティグループを使用できません。 | Amazon DocumentDB アクション: 新しいセキュリティグループを作成する | 
| パターン DocumentDB-ec2-n に一致する名前をもつ Amazon DocumentDB データベースに関連付けられたセキュリティグループが 1 つ以上存在します。パターンに一致するセキュリティグループは変更されていません。このセキュリティグループには、EC2 インスタンスの VPC セキュリティグループをソースとするインバウンドルールが 1 つのみ存在します。 | 接続に有効な EC2 セキュリティグループは存在しますが、EC2 インスタンスに関連付けられていません。このセキュリティグループには、パターン DocumentDB-ec2-n に一致する名前が付いています。このセキュリティグループには変更が加えられていません。このセキュリティグループには、Amazon DocumentDB データベースの VPC セキュリティグループをソースとするアウトバウンドルールが 1 つのみ存在します。 | Amazon DocumentDB アクション: EC2 セキュリティグループを関連付ける | 
| 次の条件のいずれかが適用されます。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/connect-ec2-auto.html)  | EC2 インスタンスに関連付けられた、パターン DocumentDB-ec2-n に一致する名前のセキュリティグループが 1 つまたは複数存在します。パターンに一致するセキュリティグループは変更されていません。このセキュリティグループには、Amazon DocumentDB データベースの VPC セキュリティグループをソースとするアウトバウンドルールが 1 つのみ存在します。 | Amazon DocumentDB アクション: 新しいセキュリティグループを作成する | 

**Amazon DocumentDB アクション: 新しいセキュリティグループを作成する**

Amazon DocumentDB は以下のアクションを実行します。
+ パターン `DocumentDB-ec2-n` に一致する新しいセキュリティグループを作成します。このセキュリティグループには、EC2 インスタンスの VPC セキュリティグループをソースとするインバウンドルールが存在します。このセキュリティグループは Amazon DocumentDB データベースに関連付けられており、EC2 インスタンスが Amazon DocumentDB データベースにアクセスするのを許可します。
+ パターン `ec2-DocumentDB-n` に一致する新しいセキュリティグループを作成します。このセキュリティグループには、Amazon DocumentDB データベースの VPC セキュリティグループをソースとするアウトバウンドルールが存在します。このセキュリティグループには EC2 インスタンスに関連付けられており、EC2 インスタンスが Amazon DocumentDB データベースにトラフィックを送信するのを許可します。

**Amazon DocumentDB アクション: EC2 セキュリティグループを関連付ける**

Amazon DocumentDB は、有効な既存の EC2 セキュリティグループを EC2 インスタンスに関連付けます。このセキュリティグループは、EC2 インスタンスが Amazon DocumentDB データベース にトラフィックを送信するのを許可します。

## 接続中のコンピューティングリソースを表示する
<a name="auto-connect-ec2.compute"></a>

を使用して AWS マネジメントコンソール 、Amazon DocumentDB データベースに接続されているコンピューティングリソースを表示できます。表示されるリソースには、自動的に設定されたコンピューティングリソース接続が含まれます。コンピューティングリソースとの接続は、次の方法で自動的に設定できます。
+ データベースを作成するときに、コンピューティングリソースを選択できます。詳細については、「[Amazon DocumentDB クラスターの作成](db-cluster-create.md)」および「マルチ AZ DB クラスターの作成」を参照してください。
+ 既存のデータベースとコンピューティングリソース間の接続を設定できます。詳細については、「[Amazon EC2 への自動接続](#connect-ec2-auto)」を参照してください。

コンピューティングリソースリストには、手動でデータベースに接続されたものは含まれていません。例えば、データベースに関連付けられた VPC セキュリティグループにルールを追加することで、コンピューティングリソースがデータベースに手動でアクセスできるようになります。

コンピューティングリソースをリスト化するには、次の条件を満たしている必要があります。
+ コンピューティングリソースに関連付けられているセキュリティグループの名前がパターン `ec2-DocumentDB-n` (n は数字) と一致する。
+ コンピューティングリソースに関連付けられたセキュリティグループには、Amazon DocumentDB データベースが使用するポート向けに設定されたポート範囲を持つアウトバウンドルールがある。
+ コンピューティングリソースに関連付けられたセキュリティグループには、Amazon DocumentDB データベースに関連付けられたセキュリティグループをソースとするアウトバウンドルールがある。
+ Amazon DocumentDB データベースに関連付けられたセキュリティグループの名前が、パターン `DocumentDB-ec2-n` (n は数字) に一致する。
+ Amazon DocumentDB データベースに関連付けられたセキュリティグループには、Amazon DocumentDB データベースが使用するポート向けに設定されたポート範囲を持つインバウンドルールがある。
+ Amazon DocumentDB データベースに関連付けられたセキュリティグループには、コンピューティングリソースに関連付けられたセキュリティグループをソースとするインバウンドルールがある。

**Amazon DocumentDB データベースに接続されているコンピューティングリソースを確認するには**

1. にサインインし AWS マネジメントコンソール、[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb) で Amazon DocumentDB コンソールを開きます。

1. ナビゲーションペインで、**[データベース]** を選択し、確認したい Amazon DocumentDB データベースの名前を選択します。

1. **[接続とセキュリティ]** タブ内の **[接続されたコンピューティングリソース]** で、接続されているコンピューティングリソースを確認します。

# Amazon EC2 を手動で接続する
<a name="connect-ec2-manual"></a>

**Topics**
+ [ステップ 1: Amazon EC2 インスタンスを作成する](#manual-connect-ec2.launch-ec2-instance)
+ [ステップ 2: セキュリティグループを作成する](#manual-connect-ec2.security-group)
+ [ステップ 3: Amazon DocumentDB クラスターを作成する](#manual-connect-ec2.launch-cluster)
+ [ステップ 4: Amazon EC2 インスタンスに接続します](#manual-connect-ec2.connect)
+ [ステップ 5: MongoDB シェルをインストールする](#manual-connect-ec2.install-mongo-shell)
+ [ステップ 6: Amazon DocumentDB TLS の管理](#manual-connect-ec2.tls)
+ [ステップ 7: Amazon DocumentDB クラスターに接続する](#manual-connect-ec2.connect-use)
+ [ステップ 8: データの挿入とクエリ](#manual-cloud9-insert-query)
+ [ステップ 9: 環境情報の確認](#manual-connect-ec2.explore)

以下の手順は、「[前提条件](connect-ec2.md#connect-ec2-prerequisites)」トピックに記載されるステップが完了済みであることを前提としています。

## ステップ 1: Amazon EC2 インスタンスを作成する
<a name="manual-connect-ec2.launch-ec2-instance"></a>

このステップでは、後で Amazon DocumentDB クラスターのプロビジョニングに使用するのと同じリージョンと Amazon VPC に Amazon EC2 インスタンスを作成します。

1. Amazon EC2 コンソールで、[**インスタンスを起動**] を選択します。  
![\[Amazon EC2 コンソールの [インスタンスを起動] セクション。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/launch-instance.png)

1. **[名前とタグ]** セクション内の **[名前]** フィールドに、名前または識別子を入力します。

1. **[Amazon マシンイメージ (AMI)]** ドロップダウンリストで、**[Amazon Linux 2 AMI]** を選択します。  
![\[Amazon Linux 2 AMI オプションが [クイックスタート] セクションで選択された [アプリケーションおよび OS イメージ] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/linux2-ami.png)

1. **[インスタンスタイプ]** のドロップダウンリストで、**[t3.micro]** を選択します。

1. **[キーペア (ログイン)]** セクションで、既存のキーペアの識別子を入力するか、もしくは **[新しいキーペアの作成]** を選択します。  
![\[キーペア名フィールドと新しいキーペアの作成オプションを示す [キーペア] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/key-pair.png)

   Amazon EC2 キーペアを指定する必要があります。
   + Amazon EC2 のキーペアがある場合 :

     1. キーペアを選択し、リストからご自身のキーペアを選択します。

     1. Amazon EC2 インスタンスにログインするには、あからじめプライベートキーファイル (.pem もしくは.ppk ファイル) を利用可能にしておく必要があります。
   + Amazon EC2 のキーペアがない場合:

     1. **[新しいキーペアの作成]** を選択すると、**[キーペアの作成]** ダイアログボックスが表示されます。

     1. **[キーペア名]** フィールドに名前を入力します。

     1. **[キーペアタイプ]** と **[プライベートキーファイル形式]** を選択します。

     1. [**キーペアの作成**] を選択してください。  
![\[キーペア名、タイプ、ファイル形式がある [キーペアの作成] インターフェイス。[キーペアの作成] ボタンは右下隅にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/create-key-pair.png)
**注記**  
セキュリティ上の理由から、SSH とインターネット両方からの EC2 インスタンスへの接続にキーペアを使用することを強くお勧めします。

1. **[ネットワーク設定]** セクションの **[ファイアウォール (セキュリティグループ)]** で、**[セキュリティグループの作成]** または **[既存のセキュリティグループを選択する]** を選択します。  
![\[セキュリティグループを作成するためのオプションを示す [ネットワーク設定] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/firewall.png)

   既存のセキュリティグループを選択する場合は、**[共通セキュリティグループ]** ドロップダウンリストから選択します。

   新しいセキュリティグループの作成を選択する場合は、以下を実行します。

   1. EC2 への接続に適用されるすべてのトラフィック許可ルールを確認します。

   1. [IP] フィールドで、**[マイ IP]** または **[カスタム]** を選択して、CIDR ブロックのリスト、プレフィックスリスト、もしくはセキュリティグループのいずれかを選択します。ここで **[Anywhere]** を選択するとどの IP アドレスからでも EC2 インスタンス へのアクセスが可能になるため、EC2 インスタンスが分離されたネットワーク上にある場合を除き、[Anywhere] を選択することはお勧めしません。  
![\[My IP ドロップダウン。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/ip-field.png)

1. **[概要]** セクションで、EC2 設定を確認し、問題がなければ **[インスタンスを起動]** を選択します。

## ステップ 2: セキュリティグループを作成する
<a name="manual-connect-ec2.security-group"></a>

次に、デフォルトの Amazon VPC に新しいセキュリティグループを作成します。セキュリティグループ `demoDocDB` では、Amazon EC2 インスタンスからポート 27017 (Amazon DocumentDB のデフォルトポート) で Amazon DocumentDB クラスターに接続できます。

1. [Amazon EC2 マネジメントコンソール](https://console.aws.amazon.com/ec2) で、[**ネットワークとセキュリティ**] の下にある [**セキュリティグループ**] を選択します。  
![\[[ネットワークとセキュリティ] ドロップダウンで [セキュリティグループ] オプションが選択された Amazon DocumentDB コンソールのナビゲーションペイン。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/nav-security-groups.png)

1. **[セキュリティグループの作成]** を選択してください。  
![\[[セキュリティグループの作成] ボタンを選択します。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/create-sg-btn-2.png)

1. **[基本的な詳細]** セクションで、次の操作を行います。

   1. [**Security group name (セキュリティグループ名)**] に「 `demoDocDB` 」と入力します。

   1. [**説明**] に説明を入力します。

   1. **VPC** については、デフォルトの VPC の使用を受け入れます。

1. [**インバウンドルール**] セクションで、[**ルールの追加**] を選択します。

   1. [**タイプ**] で [**カスタム TCP ルール**] を選択します (デフォルト)。

   1. **[ポート範囲]** に `27017` と入力します。

   1. **[ソース]** で **[カスタム]** を選択します。その横にあるフィールドで、先ほどステップ 1 で作成したセキュリティグループを検索します。 のソース名を自動入力するには、Amazon EC2 コンソールでブラウザを更新することが必要な場合があります。  
![\[タイプ、プロトコル、ポート範囲、ソース、および説明のフィールドを示す [インバウンドルール] セクション。[ルールの追加] ボタンは左下隅にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/inbound-rules.png)

1. 他のすべてのデフォルトを受け入れ、[**セキュリティグループの作成**] を選択します。  
![\[[セキュリティグループの作成] ボタンを選択します。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/create-sg-btn-2.png)

## ステップ 3: Amazon DocumentDB クラスターを作成する
<a name="manual-connect-ec2.launch-cluster"></a>

Amazon EC2 インスタンスのプロビジョニング中は、Amazon DocumentDB クラスターを作成します。

1. Amazon DocumentDB コンソールに移動し、ナビゲーションペインから **クラスター** を選択します。

1. **[作成]** を選択します。

1. **[クラスタータイプ]** 設定は、デフォルトの **[インスタンスベースのクラスター]** のままにしておきます。

1. **[クラスター設定]** では、一意の **[クラスター名]** を入力します。コンソール操作では、入力方法に関係なくクラスター名のすべての文字が小文字に変換されることにご留意ください。

   **[エンジンバージョン]** はデフォルト値の **5.0.0** のままにします。

1. **[クラスターストレージ設定]** では、**Amazon DocumentDB Standard** のデフォルト設定のままにします。

1. **[インスタンスの設定]** で:
   + **[DB インスタンスクラス]** では、**メモリ最適化クラス (r クラスを含む) ** を選択します (デフォルト）。

     もう 1 つのインスタンスオプションは **NVMe-backed クラス** です。詳細については [NVMe-backed インスタンス](db-instance-nvme.md) を参照してください。
   + **[インスタンスクラス]** では、ニーズに合ったインスタンスタイプを選択します。インスタンスクラスの詳細については、「[インスタンスクラスの仕様](db-instance-classes.md#db-instance-class-specs)」を参照してください。
   + **[インスタンスの数]** では、ニーズを最も反映する数を選択します。数値が低いほど、コストが低くなり、クラスターで管理できる読み取り/書き込みボリュームが低くなることに注意してください。  
![\[インスタンス数が 1 に設定されている、クラスター識別子、エンジンバージョン、およびインスタンスクラスのデフォルト値がある設定インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/create-cluster/instance-config.png)

1. **[接続]** は、デフォルト設定の **[EC2 コンピューティングリソースに接続しない]** のままにしておきます。
**注記**  
EC2 コンピューティングリソースに接続すると、お使いのクラスターへの接続向けセキュリティグループが自動的に作成されます。前のステップでセキュリティグループを既に手動で作成しているため、追加のセキュリティグループのセットが作成されないように、**[EC2 コンピューティングリソースに接続しない]** を選択しておく必要があります。

1. **[認証]** セクションで、プライマリユーザーのユーザー名を入力し、**[セルフマネージド]** を選択します。パスワードを入力して確認します。

   代わりに **Managed in AWS Secrets Manager** を選択した場合、詳細については[Amazon DocumentDB と によるパスワード管理 AWS Secrets Manager](docdb-secrets-manager.md)「」を参照してください。

1. **[クラスターを作成]** を選択します。

## ステップ 4: Amazon EC2 インスタンスに接続します
<a name="manual-connect-ec2.connect"></a>

Amazon EC2 インスタンスに接続すると、MongoDB シェルをインストールできるようになります。Mongo シェルをインストールすると、Amazon DocumentDB クラスターに接続してクエリを実行できます。以下のステップを実行します。

1. Amazon EC2 コンソールで、インスタンスに移動し、作成したインスタンスが実行中かどうかを確認します。実行されている場合は、インスタンス ID をクリックしてインスタンスを選択します。  
![\[Amazon EC2 コンソールで 2 つのインスタンスを一覧表示するインスタンステーブル。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/ec2-instance-table.png)

1. **接続** を選択します。  
![\[Amazon EC2 インスタンスのインスタンス概要。[接続] ボタンは右上隅にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/ec2-instance-summary.png)

1. 接続方法として、Amazon EC2 Instance Connect、セッションマネージャー、SSH クライアント、EC2 シリアルコンソールの 4 つのオプションがタブ形式で表示されます。いずれかを選択し、その指示に従わなければなりません。完了したら、**[接続する]** を選択します。  
![\[EC2 Instance Connect の接続方法の設定オプションを示すインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ec2/connect-options.png)

**注記**  
このチュートリアルの開始後に IP アドレスが変更された場合、または後で環境に戻る場合は、`demoEC2` セキュリティグループのインバウンドルールを更新して、新しい API アドレスからのインバウンドトラフィックを有効化します。

## ステップ 5: MongoDB シェルをインストールする
<a name="manual-connect-ec2.install-mongo-shell"></a>

これで、MongoDB シェルをインストールできます。これは、Amazon DocumentDB クラスターに接続してクエリするために使用するコマンドラインのユーティリティです。現在、MongoDB シェルには最新バージョンの mongosh と以前のバージョンの mongo シェルの 2 つのバージョンがあります。

**重要**  
なお、バージョン 6.13.1 より前の Node.js ドライバーには既知の制限事項があり、現在 Amazon DocumentDB の IAM ID 認証ではサポートされていません。Node.js ドライバーを使用する Node.js ドライバーとツール (例えば、mongosh) は、Node.js ドライバーバージョン 6.13.1 以降を使用するようにアップグレードする必要があります。

以下の手順に従って、オペレーションシステム用の MongoDB シェルをインストールします。

------
#### [ On Amazon Linux ]

**Amazon Linux で MongoDB シェルをインストールするには**

IAM を使用して*おらず*、最新の MongoDB シェル (mongosh) を使用して Amazon DocumentDB クラスターに接続する場合は、次の手順に従います。

1. リポジトリファイルを作成します。作成した EC2 インスタンスのコマンドラインで、次のコマンドを入力します。

   ```
   echo -e "[mongodb-org-5.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/5.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://pgp.mongodb.com/server-5.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-5.0.repo
   ```

1. 完了したら、コマンドプロンプトで次の 2 つのコマンドオプションのいずれかを使用して mongosh をインストールします。

   **オプション 1** — Amazon EC2 の設定中にデフォルトの Amazon Linux 2023 を選択した場合は、次のコマンドを入力します。

   ```
   sudo yum install -y mongodb-mongosh-shared-openssl3
   ```

   **オプション 2** — Amazon EC2 の設定中に Amazon Linux 2 を選択した場合は、次のコマンドを入力します。

   ```
   sudo yum install -y mongodb-mongosh
   ```

IAM を使用している場合は、以前のバージョンの MongoDB シェル (5.0) を使用して Amazon DocumentDB クラスターに接続する必要があり、次の手順を実行します。

1. リポジトリファイルを作成します。作成した EC2 インスタンスのコマンドラインで、次のコマンドを入力します。

   ```
   echo -e "[mongodb-org-5.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/5.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://pgp.mongodb.com/server-5.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-5.0.repo
   ```

1. 完了したら、コマンドプロンプトで次のコマンドオプションを使用して mongodb 5.0 シェルをインストールします。

   ```
   sudo yum install -y mongodb-org-shell
   ```

------
#### [ On Ubuntu ]

**Ubuntu に mongosh をインストールするには**

1. パッケージ管理システムで使用されるパブリックキーをインポートします。

   ```
   curl -fsSL https://pgp.mongodb.com/server-5.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-5.0.gpg
   ```

1. Ubuntu のバージョンに適切なコマンドを使用して、MongoDB の リストファイル `mongodb-org-5.0.list` を作成します。

   ```
   echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-5.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
   ```

1. 次のコマンドを使用してローカルパッケージデータベースをインポートして更新します。

   ```
   sudo apt-get update
   ```

1. mongosh をインストールします。

   ```
   sudo apt-get install -y mongodb-mongosh
   ```

以前のバージョンの MongoDB の Ubuntu システムへのインストールについては、「 [Install MongoDB Community Edition on Ubuntu](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/) 」を参照してください。

------
#### [ On other operating systems ]

mongo シェルを他のオペレーティングシステムにインストールするには、MongoDB ドキュメントの「 [MongoDB Community Edition のインストール](https://www.mongodb.com/docs/manual/administration/install-community/) 」を参照してください。

------

## ステップ 6: Amazon DocumentDB TLS の管理
<a name="manual-connect-ec2.tls"></a>

次のコード `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem` を使用して Amazon DocumentDB の CA 証明書をダウンロードします。

**注記**  
全ての新しい Amazon DocumentDB クラスターに対して、デフォルトで Transport Layer Security (TLS) が有効になっています。詳細については、「[Amazon DocumentDB クラスター TLS 設定の管理](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html)」を参照してください。

## ステップ 7: Amazon DocumentDB クラスターに接続する
<a name="manual-connect-ec2.connect-use"></a>

1. Amazon DocumentDB コンソールの **[クラスター]** で、接続したいクラスターを見つけます。そのクラスターの **[クラスター識別子]** をクリックして、作成済みのクラスターを選択します。  
![\[プライマリインスタンスの詳細を含むリージョンクラスターを示す Amazon DocumentDB クラスターリスト。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/cluster-connect-choose.png)

1. **[接続とセキュリティ]** タブの **[接続する]** ボックス内で、**[mongo シェルを使用してこのクラスターに接続する]** を見つけます。  
![\[Mongo シェルを使用して Amazon DocumentDB クラスターに接続するための Amazon DocumentDB 接続文字列が強調表示されたクラスター接続設定。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/connect-mongosh.png)

   表示された接続文字列をコピーし、ターミナルに貼り付けます。

   これに以下の変更を加えます。

   1. 文字列に正しいユーザー名が含まれているのを確認してください。

   1. `<insertYourPassword>` は省略します。これにより、接続時に mongo シェルによりパスワードの入力を求められます。

   1. オプション: IAM 認証を使用している場合、または以前のバージョンの MongoDB シェルを使用している場合は、次のように接続文字列を変更します。

      `mongo --ssl --host mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1.docdb.amazonaws.com:27017 --sslCAFile global-bundle.pem --username SampleUser1 --password`

      `mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1` をクラスターの同じ情報に置き換えます。

1. ターミナル上で Enter キーを押します。ここで、パスワードの入力を求められます。パスワードを入力します。

1. パスワードを入力し、`rs0 [direct: primary] <env-name>>` プロンプトが表示されたら、Amazon DocumentDB クラスターに正常に接続されています。

接続に問題がありますか。[Amazon DocumentDB のトラブルシューティング](https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html) を参照してください。

## ステップ 8: データの挿入とクエリ
<a name="manual-cloud9-insert-query"></a>

クラスターに接続できたので、いくつかのクエリを実行して、ドキュメントデータベースの使用に慣れることができます。

1. 1 つのドキュメントを挿入するには、次のように入力します。

   ```
   db.collection.insertOne({"hello":"DocumentDB"})
   ```

   次の出力が返ります。

   ```
   {
     acknowledged: true,
     insertedId: ObjectId('673657216bdf6258466b128c')
   }
   ```

1. `findOne()` コマンドで書き込んだドキュメントを読み取ることができます (一つのドキュメントしか返さないため)。以下を入力します。

   ```
   db.collection.findOne()
   ```

   次の出力が返ります。

   ```
   { "_id" : ObjectId("5e401fe56056fda7321fbd67"), "hello" : "DocumentDB" }
   ```

1. さらにいくつかのクエリを実行するには、ゲームプロファイルのユースケースを検討してください。まず、「`profiles`」というタイトルのコレクションにエントリをいくつか挿入します。以下を入力します。

   ```
   db.profiles.insertMany([{ _id: 1, name: 'Matt', status: 'active', level: 12, score: 202 }, 
         { _id: 2, name: 'Frank', status: 'inactive', level: 2, score: 9 }, 
         { _id: 3, name: 'Karen', status: 'active', level: 7, score: 87 }, 
         { _id: 4, name: 'Katie', status: 'active', level: 3, score: 27 }
   ])
   ```

   次の出力が返ります。

   ```
   { acknowledged: true, insertedIds: { '0': 1, '1': 2, '2': 3, '3': 4 } }
   ```

1. `find()` コマンドを使用して、プロファイルコレクション内のすべてのドキュメントを返します。以下を入力します。

   ```
   db.profiles.find()
   ```

   ステップ 3 で入力したデータと一致する出力を取得します。

1. フィルターを使用して 1 つのドキュメントに対して1つのクエリを使用します。以下を入力します。

   ```
   db.profiles.find({name: "Katie"})
   ```

   次の出力が返ります。

   ```
   { "_id" : 4, "name" : "Katie", "status": "active", "level": 3, "score":27}
   ```

1. それでは、プロファイルを探して、それを `findAndModify` コマンドで変更してみましょう。次のコードを使用して、ユーザー Matt に 10 ポイント追加します。

   ```
   db.profiles.findAndModify({
           query: { name: "Matt", status: "active"},
           update: { $inc: { score: 10 } }
       })
   ```

   次のような出力が得られます (Mattのスコアはまだ上がっていないことに注意してください) 。

   ```
   {
       [{_id : 1, name : 'Matt', status: 'active', level: 12, score: 202}]
   ```

1. 次のクエリを使用して、Matt のスコアが変更されたことを確認できます。

   `db.profiles.find({name: "Matt"})`

   次の出力が返ります。

   ```
   { "_id" : 1, "name" : "Matt", "status" : "active", "level" : 12, "score" : 212 }
   ```

## ステップ 9: 環境情報の確認
<a name="manual-connect-ec2.explore"></a>

お疲れ様でした。Amazon DocumentDB のクイックスタートガイドを正常に完了しました。

次のステップ この強力なデータベースを一般的な特徴をいくつか使って十分に活用する方法を学びましょう。
+  [Amazon DocumentDB の管理](https://docs.aws.amazon.com/documentdb/latest/developerguide/managing-documentdb.html) 
+  [スケーリング](https://docs.aws.amazon.com/documentdb/latest/developerguide/operational_tasks.html) 
+  [バックアップと復元](https://docs.aws.amazon.com/documentdb/latest/developerguide/backup_restore.html) 

**注記**  
コストを節約するために、Amazon DocumentDB クラスターを停止してコストを削減するか、クラスターを削除することができます。デフォルトでは、30 分間非アクティブになると、 AWS Cloud9 環境は基盤となる Amazon EC2 インスタンスを停止します。

# Amazon DocumentDB JDBC ドライバーを使用して接続する
<a name="connect-jdbc"></a>

Amazon DocumentDB 用の JDBC ドライバーは、デベロッパーのための SQL リレーショナルインターフェイスを提供し、Tableau や DBVisualizer などの BI ツールからの接続を可能にします。

詳細については、[GitHub 上の Amazon DocumentDB JDBC ドライバーのドキュメント](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/index.md) を参照してください。

**Topics**
+ [開始方法](#connect-jdbc-gettingstarted)
+ [Tableau デスクトップから Amazon DocumentDB に接続する](connect-jdbc-tableau.md)
+ [DbVisualizer から Amazon DocumentDB に接続する](connect-jdbc-DbVisualizer.md)
+ [JDBC スキーマの自動生成](connect-jdbc-autoschemagen.md)
+ [SQL サポートと制限](connect-jdbc-sqlandlimits.md)
+ [トラブルシューティング](connect-jdbc-troubleshooting.md)

## 開始方法
<a name="connect-jdbc-gettingstarted"></a>

**ステップ 1. Amazon DocumentDB クラスターの作成**  
Amazon DocumentDB クラスターが作成されていない場合は、Amazon DocumentDB デベロッパーガイドの [開始方法](https://docs.aws.amazon.com/documentdb/latest/developerguide/get-started-guide.html) のセクションの手順を使用してクラスターを作成します。  
Amazon DocumentDB は仮想プライベートクラウド (VPC) 専用サービスです。クラスターの VPC 外にあるローカルマシンから接続する場合は、Amazon EC2 インスタンスへの SSH 接続を作成する必要があります。この場合、[EC2 を使用して接続](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html) の手順に従ってクラスターを起動します。SSH トンネリングおよび必要な場合の詳細については、[SSH トンネルを使って Amazon DocumentDB に接続する](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/setup/setup.md#using-an-ssh-tunnel-to-connect-to-amazon-documentdb) を参照してください。

**ステップ 2. JRE または JDK インストール**  
BI アプリケーションによっては、64 ビット JRE または JDK インストールバージョン 8 以降がコンピュータにインストールされていることを確認する必要がある場合があります。Java SE ランタイム環境 8 をダウンロードは [こちら](https://www.oracle.com/ca-en/java/technologies/javase-jre8-downloads.html)。

**ステップ 3. DocumentDB JDBC ドライバーのダウンロード**  
[here( こちら )](https://github.com/aws/amazon-documentdb-jdbc-driver/releases) からのDocumentDB JDBC ドライバーのダウンロード ドライバーは単一の JAR ファイルとしてパッケージ化されています (例: documentdb-jdbc-1.0.0-all.jar)。

**ステップ 4. SSH トンネルを使用して Amazon DocumentDB に接続する**  
Amazon DocumentDB (MongoDB との互換性) クラスターは、Amazon Virtual Private Cloud (Amazon VPC) 内にデプロイされます。これらは、Amazon EC2 インスタンス、または同じ Amazon VPC にデプロイされている他の AWS サービスから直接アクセスできます。さらに、Amazon DocumentDB は、VPC ピアリングを介して、同じ AWS リージョンまたは他のリージョンの異なる VPCs 内の EC2a インスタンスまたは他の AWS サービスからアクセスできます。  
SSH トンネリング (ポート転送とも呼ばれます) を使用して、クラスターの VPC 外部から Amazon DocumentDB リソースにアクセスできます。これは、ほとんどのユーザーが DocumentDB クラスターと同じ VPC 内の仮想マシンでアプリケーションを実行していない場合です。  
SSH トンネルを作成するには、Amazon DocumentDB クラスターと同じ Amazon VPC で実行中の Amazon EC2 インスタンスが必要です。クラスターと同じ VPC で既存の EC2 インスタンスを使用するか、新しい EC2 インスタンスを作成できます。その場合、ローカルコンピュータで以下のコマンドを実行することにより Amazon DocumentDB クラスター `sample-cluster.node.us-east-1.docdb.amazonaws.com` に SSH トンネルを設定できます。  

```
ssh -i "ec2Access.pem" -L 27017:sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 ubuntu@ec2-34-229-221-164.compute-1.amazonaws.com -N 
```
ローカルポートの転送を行う場合は、-L フラグを使用します。これは、VPC 外のクライアントで実行されている BI ツールに接続するための前提条件です。上記のステップを実行したら、選択した BI ツールの次のステップに進むことができます。  
SSH トンネリングの詳細については、[SSH トンネルを使用して Amazon DocumentDB に接続する](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/setup/setup.md#using-an-ssh-tunnel-to-connect-to-amazon-documentdb ) のドキュメントを参照してください。

# Tableau デスクトップから Amazon DocumentDB に接続する
<a name="connect-jdbc-tableau"></a>

**Topics**
+ [Amazon DocumentDB JDBC ドライバーの追加](#connect-jdbc-tableau-adddriver)
+ [Tableau を使用して Amazon DocumentDB に接続する - SSH トンネル](#connect-jdbc-tableau-ssh)

## Amazon DocumentDB JDBC ドライバーの追加
<a name="connect-jdbc-tableau-adddriver"></a>

Tableau デスクトップから Amazon DocumentDB に接続するには、DocumentDB JDBC ドライバーと DocumentDB Tableau コネクタをダウンロードしてインストールする必要があります。

1. Amazon DocumentDB JDBC ドライバー JAR ファイルを [Amazon DocumentDB JDBC ドライバーレポジトリ](https://github.com/aws/amazon-documentdb-jdbc-driver/releases) からダウンロードし、ご使用のオペレーティングシステムに応じて次のいずれかのディレクトリにコピーします。
   + *Windows* – `C:\Program Files\Tableau\Drivers`
   + *MacOS* – `~/Library/Tableau/Drivers`

1. DocumentDB Tableau コネクタ (TACO ファイル) を [Tableau Exchange ウェブサイト](https://exchange.tableau.com/products/821) からダウンロードし、*My Tableau リポジトリ/コネクタディレクトリ* にコピーします。
   + *Windows* – `C:\Users\[user]\Documents\My Tableau Repository\Connectors`
   + *MacOS* – `/Users/[user]/Documents/My Tableau Repository/Connectors`

詳細 (追加情報) については、[Tableau のドキュメント](https://tableau.github.io/connector-plugin-sdk/docs/run-taco) を参照してください。

**注記**  
新しい CA 証明書を使用している場合は、JDBC ドライバーを v1.4.5 (この AWS [GitHub リポジトリ](https://github.com/aws/amazon-documentdb-jdbc-driver/releases/tag/v1.4.5)で利用可能) にアップグレードしてください。

## Tableau を使用して Amazon DocumentDB に接続する - SSH トンネル
<a name="connect-jdbc-tableau-ssh"></a>

DocumentDB クラスターの VPC 外のクライアントマシンから Tableau に接続するには、以下のステップを実行する前に SSH トンネルを設定する必要があります。

1. Tableau デスクトップアプリケーションを起動します。

1. **Connect** > **To A Server** > **More** に移動します。

1.  **[インストールされたコネクタ]** で **Amazon Web Services の Amazon DocumentDB** を選択します。  
![\[Tableau Desktop の [接続] インターフェイスには、[サーバーへ] セクションの [さらに...] サブメニューが表示されます。Amazon DocumentDB オプションは、[インストール済みコネクタ] サブメニューで強調表示されます。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/tableau-choose-docdb.png)

**Tableau を使用して Amazon DocumentDB に接続する - 外部 SSH トンネル**

1. 必要な接続パラメータを入力します。**Hostname**、**ポート**、**データベース**、**ユーザーネーム**、**パスワード** です。以下の例の接続パラメータは、JDBC 接続文字列に相当します。

   ユーザーネームとパスワードのパラメータを伴う `jdbc:documentdb://localhost:27019/test? tls=true&tlsAllowInvalidHostnames=true&scanMethod=random&scanLimit=1000&loginTimeoutSec=0&readPreference=primary&retryReads=true&schemaName=_default` は、プロパティコレクションで別々に渡されました。接続文字列パラメータの詳細については、[Amazon DocumentDB JDBC ドライバー github ドキュメント](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/setup/connection-string.md) を参照してください。  
![\[ホスト名、ポート、データベース、ユーザー名、パスワードフィールドを示す [Amazon DocumentDB コネクタ] インターフェイスの [全般] タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/tableau-connect.png)

1. (オプション) より高度なオプションは、**アドバンスト** タブで見つけることができます。  
![\[[追加の接続] オプションを示す [Amazon DocumentDB コネクタ] インターフェイスの [詳細設定] タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/tableau-advanced.png)

1. [**サインイン**] を選択します。

**Tableau を使用して Amazon DocumentDB に接続する - SSH トンネル**
**注記**  
端末を使用して SSH トンネルをセットアップしたくない場合は、Tableau GUI を使用して、JDBC ドライバーが本質的に SSH トンネルの作成に使用する EC2 インスタンスの詳細を指定できます。

1. **アドバンスト** タブで、**SSH トンネルオプションを有効にする** を選択して、その他のプロパティを確認します。  
![\[[SSH トンネルオプションを有効にする] が選択され、追加の SSH 入力フィールドが表示された Amazon DocumentDB コネクタインターフェイスの [詳細設定] タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/tableau-advanced-Enablessh.png)

1. **SSH ユーザー**、**SSH ホスト名**、**SSH プライベートキーファイル** を入力します。

1. (オプション) **SSH 厳密ホストキーチェック** オプションを無効にできます。これを使用すると、既知のホストファイルに対するホストキーのチェックをバイパスします。
**注記**  
このオプションを無効にすると、[中間者](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) 攻撃につながり得るので、安全性が低くなります。  
![\[[SSH 厳密ホストキーチェック] オプションが無効になっている Amazon DocumentDB コネクタインターフェイスの [詳細設定] タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/tableau-advanced-sshhostkeycheck.png)

1. 必要な接続パラメータを入力します。**Hostname**、**ポート**、**データベース**、**ユーザーネーム**、**パスワード** です。
**注記**  
内部 SSH トンネルオプションを使用する場合は、ローカルホストではなく DocumentDB クラスターエンドポイントを確実に使用してください。  
![\[ホスト名、ポート、データベース、ユーザー名、パスワードフィールドを示す [Amazon DocumentDB コネクタ] インターフェイスの [全般] タブ。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/tableau-hostname.png)

1. **[サインイン]** を選択します。

# DbVisualizer から Amazon DocumentDB に接続する
<a name="connect-jdbc-DbVisualizer"></a>

**Topics**
+ [Amazon DocumentDB JDBC ドライバーの追加](#connect-jdbc-DbVisualizer-adddriver)
+ [DBVisualizer を使用して Amazon DocumentDB に接続する](#connect-jdbc-DbVisualizer-connect)

## Amazon DocumentDB JDBC ドライバーの追加
<a name="connect-jdbc-DbVisualizer-adddriver"></a>

DbVisualizer から Amazon DocumentDB に接続するには、まずAmazon DocumentDB JDBC ドライバーをインポートする必要があります。

1. DbVisualizer アプリケーションをスタートし、メニューパスに移動します : **ツール > ドライバーマネージャー...**

1. **\$1** を選択します (またはメニューで、**ドライバ ー> ドライバーを作成** を選択) 。

1. [**Name**] を [`DocumentDB`] に設定します。

1. **URL 形式** を `jdbc:documentdb://<host>[:port]/<database>[?option=value[&option=value[...]]]` に設定

1. **フォルダ** ボタンを選択し、Amazon DocumentDB JDBC ドライバー JAR ファイルを選択し、**オープン** ボタンを選択します。

1. **ドライバークラス** フィールドが `software.amazon.documentdb.jdbc.DocumentDbDriver` になっていることを確認します。**DocumentDB** のドライバーマネージャの設定は、次の例のようになります。  
![\[Amazon DocumentDB 名、URL 形式、およびドライバークラス設定が入力された DbVisualizer の [ドライバー設定] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/DbVisualizer-adddriver.jpg)

1. ダイアログを閉じます。Amazon DocumentDB JDBC ドライバーがセットアップされ、使用できる状態になります。

## DBVisualizer を使用して Amazon DocumentDB に接続する
<a name="connect-jdbc-DbVisualizer-connect"></a>

DBVisualizer を使用して Amazon DocumentDB に接続する

1. Amazon DocumentDB クラスターの VPC の外部から接続する場合は、SSH トンネルが設定されていることを確認してください。

1. トップレベルメニューから、**データベース > データベース接続の作成** を選択します。

1. **名前** フィールドに、わかりやすい名前を入力します。

1. **ドライバー (JDBC)** を前のセクションで作成した DocumentDB ドライバーに設定します。

1. **データベース URL** を JDBC 接続文字列に設定します。

   例: `jdbc:documentdb://localhost:27017/database?tlsAllowInvalidHostnames=true`

1. **データベースユーザー ID** を Amazon DocumentDB ユーザー ID に設定します。

1. **データベースパスワード** を、ユーザー ID に対応するパスワードに設定します。

   データベース接続ダイアログは、次のダイアログのようになります。  
![\[DocumentDB 設定を使用した [データベース接続] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/DbVisualizer-connect.jpg)

1. **接続** を選択します。

# JDBC スキーマの自動生成
<a name="connect-jdbc-autoschemagen"></a>

Amazon DocumentDB はドキュメントデータベースであるため、テーブルとスキーマの概念はありません。ただし、Tableau などの BI ツールは、データベースがスキーマを提示することを期待します。具体的には、JDBC ドライバー接続でデータベース内のコレクションのスキーマを取得する必要がある場合は、データベース内のすべてのコレクションをポーリングします。ドライバーは、そのコレクションのスキーマのキャッシュバージョンがすでに存在するかどうかを判別します。キャッシュされたバージョンが存在しない場合は、ドキュメントのコレクションをサンプリングし、次の動作に基づいてスキーマを作成します。

**Topics**
+ [スキーマ生成の制限](#connect-jdbc-autoschemagen-limits)
+ [スキャン方法のオプション](#connect-jdbc-autoschemagen-scanningoptions)
+ [Amazon DocumentDB データ型](#connect-jdbc-autoschemagen-datatypes)
+ [スカラードキュメントフィールドのマッピング](#connect-jdbc-autoschemagen-scalarfields)
+ [オブジェクトと配列のデータ型の処理](#connect-jdbc-autoschemagen-objectandarray)

## スキーマ生成の制限
<a name="connect-jdbc-autoschemagen-limits"></a>

DocumentDB JDBC ドライバーは識別子の長さに 128 文字の制限を課しています。スキーマジェネレータは、生成された識別子 (テーブル名とカラム名) の長さを切り捨てて、その制限に適合するようにします。

## スキャン方法のオプション
<a name="connect-jdbc-autoschemagen-scanningoptions"></a>

サンプリング動作は、接続文字列またはデータソースオプションを使用して変更できます。
+ *scanMethod=*<option>
  + *random - (デフォルト) - サンプルドキュメントはランダムな順序で返されます。*
  + *idForward* - サンプルドキュメントは ID の順序で返されます。
  + *idReverse* - サンプルドキュメントは id の逆の順序で返されます。
  + *all* - コレクション内のすべてのドキュメントをサンプリングします。
+ *ScanLimit=*<n> - サンプリングするドキュメントの数。値は正の整数である必要があります。デフォルト値は *1000* です。*scanMethod* が *all* に設定されている場合、このオプションは無視されます。

## Amazon DocumentDB データ型
<a name="connect-jdbc-autoschemagen-datatypes"></a>

Amazon DocumentDB サーバーはいくつかの MongoDB データ型をサポートしています。サポートされているデータ型とそれに関連付けられた JDBC データ型を以下に示します。


| MongoDB データ型 | DocumentDB でサポートされています | JDBC データ型 | 
| --- | --- | --- | 
| バイナリデータ | はい | VARBINARY | 
| ブール値 | はい | BOOLEAN | 
| Double | はい | DOUBLE | 
| 32 ビット整数 | はい | INTEGER | 
| 64 ビット整数 | はい | BIGINT | 
| String | はい | VARCHAR | 
| ObjectId | はい | VARCHAR | 
| 日付 | 可能 | TIMESTAMP | 
| Null | はい | VARCHAR | 
| 正規表現 | はい | VARCHAR | 
| タイムスタンプ | はい | VARCHAR | 
| MinKey | はい | VARCHAR | 
| MaxKey | はい | VARCHAR | 
| オブジェクト | はい | 仮想テーブル | 
| 配列 | はい | 仮想テーブル | 
| Decimal128 | いいえ | DECIMAL | 
| JavaScript | いいえ | VARCHAR | 
| JavaScript (スコープ付き) | いいえ | VARCHAR | 
| 未定義 | いいえ | VARCHAR | 
| 記号 | いいえ | VARCHAR | 
| dbPointer (4.0\$1) | いいえ | VARCHAR | 

## スカラードキュメントフィールドのマッピング
<a name="connect-jdbc-autoschemagen-scalarfields"></a>

コレクションからドキュメントのサンプルをスキャンする場合、JDBC ドライバーは、コレクション内のサンプルを表す 1 つ以上のスキーマを作成します。一般に、ドキュメントのスカラーフィールドは、テーブルスキーマの列にマップされます。例えば、team というコレクションと 1 つのドキュメント `{ "_id" : "112233", "name" : "Alastair", "age": 25 }` の場合、これはスキーマにマップされます。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| team | チームID | VARCHAR | PK | 
| team | 名前 | VARCHAR |  | 
| team | 年齢 | INTEGER |  | 

### データ型の競合プロモーション
<a name="connect-jdbc-autoschemagen-conflictpromo"></a>

サンプリングされたドキュメントをスキャンするときに、フィールドのデータ型がドキュメント間で一貫していない可能性があります。この場合、JDBC ドライバーは JDBC データ型を、サンプリングされたドキュメントのすべてのデータ型に適合する共通データ型に昇格します。

例: 

```
{
"_id" : "112233",
"name" : "Alastair", "age" : 25
}

{
"_id" : "112244",
"name" : "Benjamin",
"age" : "32"
}
```

*年齢* フィールドは、最初のドキュメントでは 32 ビット整数ですが、2 番目のドキュメントでは文字列です。ここで、JDBC ドライバーは JDBC データ型を VARCHAR に昇格させ、いずれかのデータ型を検出したときに処理します。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| team | チームID | VARCHAR | PK | 
| team | 名前 | VARCHAR |  | 
| team | 年齢 | VARCHAR |  | 

### スカラー - スカラー競合プロモーション
<a name="connect-jdbc-autoschemagen-scalarconflictpromo"></a>

次の図表は、スカラー - スカラーデータ型の競合を解決する方法を示しています。

![\[競合するデータ型がドキュメント内で一貫性がない場合に昇格する方法を示す階層図。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/jdbc/scalar-scalar-promotion.png)


### スカラー - 複合型競合プロモーション
<a name="connect-jdbc-autoschemagen-scalar-complex"></a>

スカラー・スカラー型の競合と同様に、異なるドキュメント内の同じフィールドは、複素数（配列とオブジェクト）とスカラー（整数、ブールなど）の間で競合するデータ型を持つことができます。これらの競合はすべて、それらのフィールドについて VARCHAR に解決 (昇格) されます。この場合、配列とオブジェクトのデータは JSON 表現として返されます。

埋め込み配列 - 文字列フィールドの競合の例 :

```
{
   "_id":"112233",
   "name":"George Jackson",
   "subscriptions":[
      "Vogue",
      "People",
      "USA Today"
   ]
}
{
   "_id":"112244",
   "name":"Joan Starr",
   "subscriptions":1
}
```

上記の例は、customer2 テーブルのスキーマにマッピングされています。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| customer2 | Customer2 ID | VARCHAR | PK | 
| customer2 | 名前 | VARCHAR |  | 
| customer2 | サブスクリプション | VARCHAR |  | 

customer1\$1subscriptions 仮想テーブルは次のとおりです。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| customer1\$1subscriptions | customer1 ID | VARCHAR | PK/FK | 
| customer1\$1subscriptions | subscriptions\$1index\$1lvl0 | BIGINT | PK | 
| customer1\$1subscriptions | 値 | VARCHAR |  | 
| customer\$1address | city | VARCHAR |  | 
| customer\$1address | リージョン | VARCHAR |  | 
| customer\$1address | country | VARCHAR |  | 
| customer\$1address | コード | VARCHAR |  | 

## オブジェクトと配列のデータ型の処理
<a name="connect-jdbc-autoschemagen-objectandarray"></a>

これまでは、スカラーデータ型のマッピング方法のみについて説明しました。オブジェクトデータ型と配列データ型は (現在) 仮想テーブルにマッピングされています。JDBC ドライバーは、ドキュメント内のオブジェクトまたは配列フィールドを表す仮想テーブルを作成します。マッピングされた仮想テーブルの名前は、元のコレクションの名前の後にフィールドの名前をアンダースコア (「\$1」) で区切って連結します。

ベーステーブルの主要なキー (「\$1id」) は、新しい仮想テーブル内の新しい名前を取得し、関連付けられたベーステーブルの外部キーとして提供されます。

埋め込み配列型フィールドの場合、配列の各レベルの配列へのインデックスを表すインデックス列が生成されます。

### 埋め込みオブジェクトフィールドの例
<a name="connect-jdbc-autoschemagen-embededobj"></a>

ドキュメント内のオブジェクトフィールドの場合、仮想テーブルへのマッピングは JDBC ドライバーによって作成されます。

```
{
   "Collection: customer",
   "_id":"112233",
   "name":"George Jackson",
   "address":{
      "address1":"123 Avenue Way",
      "address2":"Apt. 5",
      "city":"Hollywood",
      "region":"California",
      "country":"USA",
      "code":"90210"
   }
}
```

上記の例は、customer テーブルのスキーマにマッピングされます。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| カスタマー | カスタマー ID | VARCHAR | PK | 
| カスタマー | 名前 | VARCHAR |  | 

および顧客アドレス仮想テーブルは次のとおりです。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| customer\$1address | カスタマー ID | VARCHAR | PK/FK | 
| customer\$1address | address1 | VARCHAR |  | 
| customer\$1address | address2 | VARCHAR |  | 
| customer\$1address | city | VARCHAR |  | 
| customer\$1address | リージョン | VARCHAR |  | 
| customer\$1address | country | VARCHAR |  | 
| customer\$1address | コード | VARCHAR |  | 

### 埋め込み配列フィールドの例
<a name="connect-jdbc-autoschemagen-embedarray"></a>

ドキュメント内の配列フィールドの場合、JDBC ドライバーによって仮想テーブルへのマッピングも作成されます。

```
{
   "Collection: customer1",
   "_id":"112233",
   "name":"George Jackson",
   "subscriptions":[
      "Vogue",
      "People",
      "USA Today"
   ]
}
```

上記の例は、customer1 テーブルのスキーマにマッピングします。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| customer1 | customer1 ID | VARCHAR | PK | 
| customer1 | 名前 | VARCHAR |  | 

customer1\$1subscriptions 仮想テーブルは次のとおりです。


| テーブル名 | Column Name (列名) | データタイプ | Key | 
| --- | --- | --- | --- | 
| customer1\$1subscriptions | customer1 ID | VARCHAR | PK/FK | 
| customer1\$1subscriptions | subscriptions\$1index\$1lvl0 | BIGINT | PK | 
| customer1\$1subscriptions | 値 | VARCHAR |  | 
| customer\$1address | city | VARCHAR |  | 
| customer\$1address | リージョン | VARCHAR |  | 
| customer\$1address | country | VARCHAR |  | 
| customer\$1address | コード | VARCHAR |  | 

# SQL サポートと制限
<a name="connect-jdbc-sqlandlimits"></a>

Amazon DocumentDB JDBC ドライバーは、SQL-92 のサブセットといくつかの一般的な拡張をSupport (サポート)する読み取り専用ドライバーです。詳細については、[SQL の制限のドキュメント](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/sql/sql-limitations.md) と [JDBC の制限のドキュメント](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/jdbc/jdbc-limitations.md) を参照してください。

# トラブルシューティング
<a name="connect-jdbc-troubleshooting"></a>

Amazon DocumentDB JDBC ドライバーの使用に問題がある場合は、[トラブルシューティングガイド](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/support/troubleshooting-guide.md) を参照してください。

# Amazon DocumentDB JDBC ドライバーを使用して接続する
<a name="connect-odbc"></a>

Amazon DocumentDB 用の ODBC ドライバーは、デベロッパーのための SQL リレーショナルインターフェイスを提供し、Power BI Desktop や Microsoft Excel などの BI ツールからの接続を可能にします。

詳細については、[GitHub 上の Amazon DocumentDB JDBC ドライバーのドキュメント](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/index.md)を参照してください。

**Topics**
+ [はじめに](#connect-odbc-get-started)
+ [Windows での Amazon DocumentDB ODBC ドライバーのセットアップ](connect-odbc-setup-windows.md)
+ [Microsoft Excel から Amazon DocumentDB に接続](connect-odbc-excel.md)
+ [Microsoft Power BI Desktop から Amazon DocumentDB に接続します](connect-odbc-power-bi.md)
+ [自動スキーマ生成](connect-odbc-schema.md)
+ [SQL サポートと制限](connect-odbc-sql-support.md)
+ [トラブルシューティング](connect-odbc-troubleshooting.md)

## はじめに
<a name="connect-odbc-get-started"></a>

**ステップ 1. Amazon DocumentDB クラスターの作成**  
Amazon DocumentDB クラスターをまだお持ちでない場合、始める方法はいくつかあります。  
Amazon DocumentDB は仮想プライベートクラウド (VPC) 専用サービスです。クラスターの VPC 外にあるローカルマシンから接続する場合は、Amazon EC2 インスタンスへの SSH 接続を作成する必要があります。この場合、[EC2 を使用して接続](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html) の手順に従ってクラスターを起動します。SSH トンネリングおよび必要な場合の詳細については、「[SSH トンネルを使って Amazon DocumentDB に接続する](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/setup.md#using-an-ssh-tunnel-to-connect-to-amazon-documentdb)」を参照してください。

**ステップ 2. JRE または JDK インストール**  
BI アプリケーションによっては、64 ビット JRE または JDK インストールバージョン 8 以降がコンピュータにインストールされていることを確認する必要がある場合があります。Java SE ランタイム環境 8 をダウンロードは [こちら](https://www.oracle.com/ca-en/java/technologies/downloads/#java8)。

**ステップ 3. Amazon DocumentDB ODBC ドライバーのダウンロード**  
Amazon DocumentDB ODBC ドライバーは[こちら](https://github.com/aws/amazon-documentdb-odbc-driver/releases)からダウンロードしてください。適切なインストーラー (たとえば documentdb-odbc-1.0.0.msi) を選択します。インストールガイドに従います。

**ステップ 4. SSH トンネルを使用して Amazon DocumentDB に接続する**  
Amazon DocumentDB クラスターは、Amazon Virtual Private Cloud (Amazon VPC) 内にデプロイされます。それらのクラスターには、同じ Amazon VPC にデプロイされている Amazon EC2 インスタンスや他の AWS のサービスから直接アクセスできます。また、Amazon DocumentDB には、同じ AWS のリージョン内に、あるいは VPC ピアリングを介する別のリージョン内にある異なる VPC 内の Amazon EC2 インスタンスや他の AWS のサービスによってアクセスできます。  
ただし、お客様のユースケースで、お客様 (またはお客様のアプリケーション) が、クラスターの VPC の外部から Amazon DocumentDB リソースにアクセスする必要があるとします。これは、ほとんどのユーザーが Amazon DocumentDB クラスターと同じ VPC 内の仮想マシンでアプリケーションを実行していない場合です。VPC 外から接続する場合、SSH トンネリング (ポート転送とも呼ばれる) を使用して Amazon DocumentDB リソースにアクセスできます。  
SSH トンネルを作成するには、Amazon DocumentDB クラスターと同じ Amazon VPC で実行中の Amazon EC2 インスタンスが必要です。クラスターと同じ VPC で既存の EC2 インスタンスを使用するか、新しい EC2 インスタンスを作成できます。その場合、ローカルコンピュータで以下のコマンドを実行することにより Amazon DocumentDB クラスター `sample-cluster.node.us-east-1.docdb.amazonaws.com` に SSH トンネルを設定できます。  

```
ssh -i "ec2Access.pem" -L 27017:sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 ubuntu@ec2-34-229-221-164.compute-1.amazonaws.com -N
```
ローカルポートの転送を行う場合は、`-L` フラグを使用します。これは、VPC 外のクライアントで実行されている BI ツールに接続するための前提条件です。上記のステップを実行したら、選択した BI ツールの次のステップに進むことができます。  
SSH トンネリングの詳細については、「[SSH トンネルを使用して Amazon DocumentDB に接続する](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/setup.md#using-an-ssh-tunnel-to-connect-to-amazon-documentdb)」ドキュメントを参照してください。

# Windows での Amazon DocumentDB ODBC ドライバーのセットアップ
<a name="connect-odbc-setup-windows"></a>

以下の手順を使用して、Windows で Amazon DocumentDB ODBC ドライバーを設定します。

1. Windows で **[コントロールパネル]** を開き、ODBC を検索します (またはメニューで **[Windows ツール]** > **[ODBC データソース (32 ビット)]** または **[ODBC データソース (64 ビット)]** を選択)。  
![\[ODBC 32 ビットおよび 64 ビットのデータソースのセットアップリンクを示す Windows コントロールパネルインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/odbc-control-panel-1.png)

1. 適切な ODBC ドライバデータソース管理者を選択します。インストールされていれば 32 ビットバージョンを、インストールされていない場合は 64 ビットバージョンを選択します。

1. [システム DSN] タブを選択し、**[追加...]** をクリックして新しいDSNを追加します。  
![\[[追加] ボタンを示す [ODBC データソース管理者] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/odbc-add-dsn-1.png)

1. データソースドライバーリストから **[Amazon DocumentDB]** を選択します。  
![\[Amazon DocumentDB ドライバーオプションが選択された [新しいデータソースの作成] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/create-data-source-1.png)

1. **[Amazon DocumentDB DSN の設定]** ダイアログで、**[接続の設定]**、**[TLS]** タブ、**[接続テスト]** の各フィールドに入力し、**[保存]** をクリックします。  
![\[[接続の設定]、[TLS]、および [接続テスト] フィールドがある [Amazon DocumentDB DSN の設定] インターフェイス。[保存] ボタンは下部にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/config-docdb-dsn-1.png)

1. 選択した EC2 インスタンスへの SSH トンネリング方法によって接続の詳細が異なるため、Windows フォームには正確に記入してください。SSH トンネリング方法については[こちら](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/setup.md#using-an-ssh-tunnel-to-connect-to-amazon-documentdb)を参照してください。各プロパティの詳細については、「[接続文字列の構文とオプション](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/connection-string.md)」を参照してください。  
![\[[SSH トンネル] フィールドが完了した [Amazon DocumentDB DSN の設定] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/config-docdb-dsn-ssh-1.png)

Windows での Amazon DocumentDB ODBC ドライバーの設定の詳細については、[こちら](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/windows-dsn-configuration.md)を参照してください。

# Microsoft Excel から Amazon DocumentDB に接続
<a name="connect-odbc-excel"></a>

1. Amazon DocumentDB ドライバーが正しくインストールされ、設定されていることを確認します。詳細については、「[Windows での ODBC ドライバーのセットアップ](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-odbc-setup-windows.html)」を参照してください。

1. Microsoft Excel を起動します。

1. **[データ]** > **[データの取得]** > **[他のソースから]** に移動します。

1. **[ODBC から]** を選択します。  
![\[[データを取得] ドロップダウンには、[他のソースから] サブメニューが表示されます。[ODBC から] オプションが選択されています。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/excel-odbc-1.png)

1. Amazon DocumentDB に関連付けられている**データソース名 (DSN)** ドロップダウンメニューから、データソースを選択します。  
![\[DocumentDB DSN オプションが選択されたデータソース名のドロップダウン。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/excel-odbc-dsn-select-1.png)

1. Excel にデータをロードするコレクションを選択します。  
![\[選択した給料テーブルとそのデータのプレビューがある [ナビゲータ] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/excel-odbc-collect-1.png)

1. Excel にデータをロードします。  
![\[選択した給料テーブルのデータの 5 行を示す Excel スプレッドシート。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/excel-data-load-1.png)

# Microsoft Power BI Desktop から Amazon DocumentDB に接続します
<a name="connect-odbc-power-bi"></a>

**Topics**
+ [前提条件](#odbc-power-bi-prerequisites)
+ [Microsoft Power BI Desktop カスタムコネクタの追加](#odbc-adding-power-bi)
+ [Amazon DocumentDB カスタムコネクタを使用して接続します](#odbc-connect-custom-connector)
+ [Microsoft Power BI ゲートウェイの設定](#odbc-power-bi-gw)

## 前提条件
<a name="odbc-power-bi-prerequisites"></a>

開始する前に、Amazon DocumentDB ODBC ドライバーが正しくインストールされていることを確認してください。

## Microsoft Power BI Desktop カスタムコネクタの追加
<a name="odbc-adding-power-bi"></a>

`AmazonDocumentDBConnector.mez` ファイルを `<User>\Documents\Power BI Desktop\Custom Connectors\` フォルダー (または OneDrive を使用している場合は `<User>\OneDrive\Documents\Power BI Desktop\Custom Connectors`) にコピーします。これにより、Power BI はカスタムコネクタにアクセスできるようになります。Power BI Desktop へのコネクタは[こちら](https://github.com/aws/amazon-documentdb-odbc-driver/releases)から入手できます。Power BI Desktop を再起動して、コネクタがロードされていることを確認します。

**注記**  
カスタムコネクタは、認証用に Amazon DocumentDB のユーザー名とパスワードのみをサポートします。

## Amazon DocumentDB カスタムコネクタを使用して接続します
<a name="odbc-connect-custom-connector"></a>

1. **[データを取得]** から [Amazon DocumentDB (ベータ)] を選択し、**[接続]** をクリックします。サードパーティサービスの使用について警告が表示された場合は、**[続行]** をクリックします。  
![\[Amazon DocumentDB (ベータ) オプションが強調表示された [データを取得] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/get-data-1.png)

1. Amazon DocumentDB クラスターに接続するために必要な情報をすべて入力し、**[OK]** をクリックします。  
![\[Amazon DocumentDB クラスターの接続詳細入力フィールドがあるフォーム。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/docdb-form-1.png)
**注記**  
ODBC ドライバーのデータソース名 (DSN) の設定によっては、DSN 設定で必要な情報をすでに提供している場合、SSH 接続の詳細画面が表示されない場合があります。

1. データ接続モードを選択します。
   + **インポート**: すべてのデータをロードし、情報をディスクに保存します。データの更新を表示するには、データを更新して再ロードする必要があります。
   + **ダイレクトクエリ**: データをロードしませんが、データに対してライブクエリを実行します。つまり、データの更新を表示するためにデータを更新したり再ロードしたりする必要はありません。  
![\[DocumentDB のデータ接続モードオプションを示すインターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/data-connectivity-1.png)
**注記**  
非常に大きなデータセットを使用している場合は、すべてのデータをインポートするのに時間がかかることがあります。

1. このデータソースに初めて接続する場合は、認証タイプを選択し、プロンプトが表示されたら認証情報を入力します。次に、**[接続]** をクリックします。  
![\[ユーザー名とパスワード認証情報の入力フィールドを示す [認証] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/docdb-credentials-1.png)

1. **[ナビゲーター]** ダイアログで、必要なデータベース表を選択し、**[ロード]** をクリックしてデータを読み込むか、**[データ変換]** をクリックしてデータの変換を続行します。  
![\[選択するデータベーステーブルのリストを示す [ナビゲータ] インターフェイス。[データをロードして変換] ボタンは右下にあります。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/navigator-1.png)
**注記**  
接続すると、データソースの設定が保存されます。設定を変更するには、**[データ変換]** > **[データソース設定]** を選択します。

## Microsoft Power BI ゲートウェイの設定
<a name="odbc-power-bi-gw"></a>

**前提条件**
+ カスタムコネクタが Power BI ゲートウェイで動作することを確認します。
+ Power BI ゲートウェイがインストールされているマシンの **[システム]** タブにある ODBC データソースに ODBC DSN が作成されていることを確認します。

内部 SSH トンネル機能を使用している場合は、Power BI サービスアカウントがアクセスできる場所に `known_hosts` ファイルを配置する必要があります。

![\[PBIEgwService のアクセス許可を示す [known_hosts プロパティ] インターフェイス。\]](http://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/images/ssh-known-hosts-1.png)


**注記**  
これは、認証機関 (CA) 証明書ファイル (pem ファイル) など、Amazon DocumentDB クラスターへの接続を確立するために必要なすべてのファイルにも当てはまります。

# 自動スキーマ生成
<a name="connect-odbc-schema"></a>

ODBC ドライバーは JNI (Java ネイティブインターフェイス) 経由で Amazon DocumentDB JDBC ドライバーを利用しているため、自動スキーマ生成機能は JDBC ドライバーでも同様に機能します。スキーマの自動生成の詳細については、「[JDBC 自動スキーマ生成](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-jdbc-autoschemagen.html)」を参照してください。また、ODBC ドライバーのアーキテクチャーについて詳しくは、[こちら](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/index.md)をご覧ください。

# SQL サポートと制限
<a name="connect-odbc-sql-support"></a>

Amazon DocumentDB ODBC ドライバーは、SQL-92 のサブセットといくつかの一般的な拡張をSupport (サポート) する読み取り専用ドライバーです。詳細については、[ODBC のサポートと制限](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/support/odbc-support-and-limitations.md)に関するドキュメントを参照してください。

# トラブルシューティング
<a name="connect-odbc-troubleshooting"></a>

Amazon DocumentDB JDBC ドライバーの使用に問題がある場合は、「[トラブルシューティングガイド](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/support/troubleshooting-guide.md) 」を参照してください。

# Amazon DocumentDB を使用したプログラム
<a name="program-docdb"></a>

このサービスは JSON スキーマ検証をサポートしています。

**Topics**
+ [DocumentDB Java プログラミングガイド](docdb-java-pg.md)
+ [JSON スキーマ検証の使用](json-schema-validation.md)

# Amazon DocumentDB Java プログラミングガイド
<a name="docdb-java-pg"></a>

この包括的なガイドでは、MongoDB の Java ドライバーを使用して Amazon DocumentDB を操作するための詳細なウォークスルーを提供し、データベースの運用と管理の重要な側面について説明します。

**Topics**
+ [序章](#java-pg-intro)
+ [前提条件](#java-pg-prereqs)
+ [データモデル](#java-pg-data-models)
+ [Java ドライバーとの接続](java-pg-connect-mongo-driver.md)
+ [Java を使用した CRUD オペレーション](java-crud-operations.md)
+ [Java によるインデックス管理](index-management-java.md)
+ [イベント駆動型プログラミング](event-driven-programming.md)

## 序章
<a name="java-pg-intro"></a>

このガイドは接続から始まり、MongoDB Java ドライバーを使用して DocumentDB クラスターへの安全な接続を確立する方法について説明します。接続文字列コンポーネント、SSL/TLS 実装、IAM 認証や接続プーリングなどのさまざまな接続オプション、堅牢なエラー処理戦略について詳しく説明します。

CRUD (作成、読み取り、更新、削除) オペレーションセクションでは、このガイドでドキュメントの操作について詳しく説明し、単一オペレーションと一括オペレーションの両方を使用してドキュメントの作成、読み取り、更新、削除を行う方法を示します。ここでは、フィルター、クエリ、およびさまざまなオペレーションオプションの使用について説明し、エラー処理のベストプラクティスと信頼性を向上させるための再試行ロジックの実装に焦点を当てています。このガイドでは、単一フィールドインデックス、複合インデックス、スパースインデックス、テキストインデックスなど、さまざまなインデックスタイプの作成とメンテナンスについて詳しく説明しています。適切なインデックス選択と、クエリ実行プランを分析するための `explain()` 関数の使用を通じてクエリパフォーマンスを最適化する方法について説明します。

最後のセクションでは、Amazon DocumentDB の変更ストリームを使用したイベント駆動型プログラミングに焦点を当て、Java アプリケーションでリアルタイムのデータ変更モニタリングを実装する方法を示します。変更ストリームカーソルの実装、継続的オペレーションの再開トークンの処理、履歴データ処理の時間ベースのオペレーションについて説明します。ガイド全体で、実用的なコード例とベストプラクティスが提供されるため、Amazon DocumentDB で堅牢な Java アプリケーションを構築する際の貴重なリソースとなります。

## 前提条件
<a name="java-pg-prereqs"></a>

作業を開始する前に、次の項目があることを確認します。
+ DocumentDB クラスターが設定された AWS アカウント。DocumentDB クラスターのセットアップについては、この [入門ブログ記事](https://aws.amazon.com/blogs/database/part-1-getting-started-with-amazon-documentdb-using-amazon-ec2/) を参照してください。
+ Java Development Kit (JDK) がインストールされている (このガイドでは [Amazon Corretto 21](https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/downloads-list.html) を使用します)。
+ 依存関係管理のための Maven。

## このガイドのデータモデル
<a name="java-pg-data-models"></a>

このガイドのすべてのサンプルコードは、「Restaurants」コレクションを持つ「ProgGuideData」テストデータベースへの接続を前提としています。このガイドのすべてのサンプルコードは、レストラン出品システムで動作します。以下は、このシステムのドキュメントの例です。

```
{
    "_id": "ab6ad8f119b5bca3efa2c7ae",
    "restaurantId": "REST-CRT9BL",
    "name": "Thai Curry Palace",
    "description": "Amazing Restaurant, must visit",
    "cuisine": "Thai",
    "address": {
        "street": "914 Park Street",
        "city": "Bryan",
        "state": "AL",
        "zipCode": "96865",
        "location": {
            "type": "Point",
            "coordinates": [-25.4619, 8.389]
        }
    },
    "contact": {
        "phone": "(669) 915-9056 x6657"
    },
    "rating": {
        "average": 3.4,
        "totalReviews": 275
    },
    "priceRange": "$",
    "menu": [{
        "category": "Appetizers",
        "items": [{
            "name": "Buffalo Chicken Wings",
            "price": 13.42
        }]
    }],
    "features": [
        "Private Dining"
    ],
    "isActive": false“ michelin”: {“
        star”: 3,
        “ranking_years”: 4
    }
}
```

CRUD、インデックス管理、イベント駆動型プログラミングを示すすべてのコードサンプルは、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html) オブジェクト `dbClient`、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoDatabase.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoDatabase.html) オブジェクト `connectionDB`、および [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#find()](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#find()) オブジェクト `collection` があることを前提としています。

**注記**  
このガイドのすべてのコード例は、MongoDB Java ドライバーバージョン 5.3.0 でテストされています。

# MongoDB Java ドライバーを使用した Amazon DocumentDB への接続
<a name="java-pg-connect-mongo-driver"></a>

このセクションでは、Java ドライバーを使用して Amazon DocumentDB に接続するためのステップバイステップのガイドを提供します。これにより、DocumentDB を Java アプリケーションへの統合を開始できるようになります。

**Topics**
+ [ステップ 1: プロジェクトをセットアップする](#step1-set-up)
+ [ステップ 2: 接続文字列を作成する](#step2-create-connection-string)
+ [ステップ 3: 接続コードを書き込む](#step3-write-connect-code)
+ [ステップ 4: 接続例外を処理する](#step4-handle-connect-exceptions)
+ [ステップ 5: コードの実行](#step5-running-code)
+ [接続のベストプラクティス](#java-connect-best-practices)

## ステップ 1: プロジェクトをセットアップする
<a name="step1-set-up"></a>

1. Maven を使用して、Java プロジェクトを作成します。

   ```
   mvn archetype:generate -DgroupId=com.docdb.guide -DartifactId=my-docdb-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
   ```

1. MongoDB Java ドライバーをプロジェクトの依存関係として「pom.xml」ファイルに追加します。

   ```
   <dependency>
       <groupId>org.mongodb</groupId>
       <artifactId>mongodb-driver-sync</artifactId> 
       <version>5.3.0</version> 
   </dependency>
   ```

## ステップ 2: 接続文字列を作成する
<a name="step2-create-connection-string"></a>

Amazon DocumentDB 接続文字列は、アプリケーションと DocumentDB クラスター間の接続を確立するために不可欠です。この文字列は、クラスターエンドポイント、ポート、認証の詳細、さまざまな接続オプションなどの重要な情報をカプセル化します。DocumentDB 接続文字列を構築するには、通常、基本的な形式から始めます。

```
"mongodb://username:password@cluster-endpoint:port/?[connection options]"
```

「username」と「password」を実際の認証情報に置き換える必要があります。クラスターのエンドポイントとポート番号は、 AWS マネジメントコンソール だけでなく、 からも確認できます AWS CLI。クラスターのクラスターエンドポイントを見つけるには、「[クラスターのエンドポイントの検索](db-cluster-endpoints-find.md)」を参照してください。DocumentDB のデフォルトのポートは、27017 です。

**接続文字列の例**
+ 転送中の暗号化を使用して DocumentDB に接続し、読み取りリクエストがリードレプリカに送信され、プライマリに書き込まれることを確認します。

  ```
  "mongodb://username:password@cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false"
  ```
+ IAM 認証を使用して DocumentDB に接続する:

  ```
  "mongodb://cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false&
     authSource=%24external&
     authMechanism=MONGODB-AWS"
  ```

接続文字列で使用できるさまざまなオプションは次のとおりです。
+ [TLS 証明書](#connection-string-tls)
+ [リードレプリカからの読み取り](#connection-string-read-rep)
+ [ライトコンサーンとジャーナリング](#connection-string-write-journal)
+ [RetryWrites](#connection-string-retry-writes)
+ [IAM 認証](#connection-string-iam-auth)
+ [接続プール](#connection-string-pool)
+ [接続タイムアウトパラメータ](#connection-string-timeout)

### TLS 証明書
<a name="connection-string-tls"></a>

**`tls=true|false`** — このオプションは Transport Layer Security (TLS) を有効または無効にします。デフォルトでは、転送中の暗号化は Amazon DocumentDB クラスターで有効になっているため、クラスターレベルで TLS が無効になっていない限り、このオプションの値は `true` である必要があります。

TLS を使用する場合、コードは DocumentDB クラスターへの接続を作成するときに SSL 証明書を提供する必要があります。クラスターへの安全な接続に必要な証明書をダウンロードします: [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem)。`global-bundle.pem` ファイルを使用するには 2 つの方法があります。
+ **オプション 1** — `global-bundle.pem` ファイルからすべての証明書を抽出し、Java の keytool を使用して、後でコードで使用できる `.jks` ファイルに保存します。これを行う方法を示すスクリプトについては、[TLS が有効な場合の接続](connect_programmatically.md#connect_programmatically-tls_enabled) の Java タブを参照してください。
+ **オプション 2** — `global-bundle.pem` ファイルをコードに動的に追加し、インメモリキーストアを構築し、`SSLContext` を使用して接続の一部として証明書を提供します。

### リードレプリカからの読み取り
<a name="connection-string-read-rep"></a>

**`replicaSet=rs0&readPreference=secondaryPreferred`** — これら 2 つのオプションを指定すると、すべての読み取りリクエストがリードレプリカにルーティングされ、書き込みリクエストがプライマリインスタンスにルーティングされます。接続文字列で `replicaSet=rs0` を使用すると、MongoDB ドライバーはクラスタートポロジの自動更新ビューを維持できるため、インスタンスの追加または削除時にアプリケーションが現在のノード設定の可視性を維持できます。これらのオプションを提供しない場合、または `readPreference=primary` を指定しない場合、すべての読み取りと書き込みがプライマリインスタンスに送信されます。`readPreference` のオプションについては、「[読み込み設定のオプション](how-it-works.md#durability-consistency-isolation)」を参照してください。

### ライトコンサーンとジャーナリング
<a name="connection-string-write-journal"></a>

書き込みの懸念は、書き込みオペレーションのためにデータベースからリクエストされた確認のレベルを決定します。MongoDB ドライバーには、書き込みの懸念ファイルとジャーナルファイルを調整するオプションがあります。Amazon DocumentDB では、書き込みの懸念とジャーナルを設定することは想定されておらず、`w` と `j` (`writeConcern` と `journal`) に送信された値は無視されます。DocumentDB は常に `writeConcern`: `majority` および `journal`: `true` でデータを書き込みます。そのため、クライアントに確認を送信する前に、書き込みは大部分のノードに永続的に記録されます。

### RetryWrites
<a name="connection-string-retry-writes"></a>

**`retryWrites=false`** — DocumentDB は再試行可能な書き込みをサポートしていないため、この属性は常に `false` に設定する必要があります。

### IAM 認証
<a name="connection-string-iam-auth"></a>

**`authSource=%24external` および `authMechanism=MONGODB-AWS`** — この 2 つのパラメータは、 を使用した認証に使用されます AWS Identity and Access Management。IAM 認証は現在、インスタンスベースのクラスターバージョン 5.0 でのみ使用できます。詳細については、「[IAM ID を使用した認証](iam-identity-auth.md)」を参照してください。

### 接続プール
<a name="connection-string-pool"></a>

これらのオプションは、接続プーリングで使用できます。
+ **`maxPoolSize`** — プールに作成できる接続の最大数を設定します。すべての接続が使用されていて、新しいリクエストが入ると、接続が利用可能になるまで待機します。MongoDB Java ドライバーのデフォルトは 100 です。
+ **`minPoolSize`** — プールで常に維持する必要がある接続の最小数を示します。MongoDB Java ドライバーのデフォルトは 0 です。
+ **`maxIdleTimeMS`** — 接続を、閉じたり削除したりする前に、プールでアイドル状態のままにできる時間を決定します。MongoDB Java ドライバーのデフォルトは 100 ミリ秒です。
+ **`waitQueueTimeoutMS`** — プールが最大サイズになったときに、接続が利用可能になるまでスレッドが待機する時間を設定します。この時間内に接続が利用可能にならない場合は、例外がスローされます。MongoDB Java ドライバーのデフォルト値は 120,000 ミリ秒 (2 分) です。

### 接続タイムアウトパラメータ
<a name="connection-string-timeout"></a>

タイムアウトは、オペレーションまたは接続の試行が失敗したと見なされるまでにかかる時間を制限するメカニズムです。次のタイムアウトパラメータは、無期限の待機を防ぎ、リソース割り当てを管理するために使用できます。
+ **`connectTimeoutMS`** — ドライバーがクラスターへの接続を確立するのを待機する時間を設定します。デフォルトは 10,000 ミリ秒 (10 秒) です。
+ **`socketTimeoutMS`** — ドライバーがサーバーからの非書き込みオペレーションのレスポンスを待機する時間を指定します。デフォルトは 0 (タイムアウトまたは無限なし) です。
+ **`serverSelectionTimeoutMS`** — ドライバーがクラスター内の使用可能なサーバーを見つけるまで待機する時間を指定します。この設定のデフォルト値は 30 秒で、フェイルオーバー中に新しいプライマリインスタンスを選択するのに十分です。

## ステップ 3: 接続コードを書き込む
<a name="step3-write-connect-code"></a>

次のコード例は、Amazon DocumentDB への TLS 接続を行う方法を示しています。
+ Java の [https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html](https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html) および [`SSLContext`>](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLContext.html) オブジェクトが作成されます。
+ また、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html) オブジェクトに渡すことで [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoClientSettings.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoClientSettings.html) オブジェクトを作成します。TLS 接続を行うには、 `MongoClientSettings` オブジェクトを使用して `connectionstring` と `sslcontext` をバインドする必要があります。
+ [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClients.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClients.html) を使用すると、 [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html) オブジェクトが取得されます。

```
public static MongoClient makeDbConnection(String dbName, String DbUserName, String DbPassword,
    String DbClusterEndPoint, String keyStorePass) throws Exception {
    MongoClient connectedClient;
    String connectionOptions = "?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false";
    String connectionUrl = "mongodb://" + DbUserName + ":" + DbPassword + "@" + DbClusterEndPoint + ":27017/" +
        dbName + connectionOptions;

    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        try (FileInputStream fis = new FileInputStream("src/main/resources/certs/truststore.jks")) {
            trustStore.load(fis, keyStorePass.toCharArray());
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(trustStore);

            SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
            sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
            ConnectionString connectionString = new ConnectionString(connectionUrl);
            MongoClientSettings settings = MongoClientSettings.builder()
                .applyConnectionString(connectionString)
                .applyToSslSettings(builder - > {
                    builder.enabled(true);
                    builder.context(sslContext);
                })
                .build();
            connectedClient = MongoClients.create(settings);
        }
        return connectedClient;
    } catch (MongoException e5) {
        throw new RuntimeException(e5);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
```

## ステップ 4: 接続例外を処理する
<a name="step4-handle-connect-exceptions"></a>

Java アプリケーションで DocumentDB を使用する場合、堅牢で信頼性の高いデータベースオペレーションを維持するには、接続例外の処理が不可欠です。これらの例外を適切に管理することで、問題を迅速に診断できるだけでなく、アプリケーションが一時的なネットワーク中断やサーバーの非可用性を正常に処理できるため、安定性とユーザーエクスペリエンスが向上します。接続の確立に関連する重要な例外には、次のようなものがあります。
+ **`MongoException`** — 一般的な例外であり、より具体的な例外の対象ではないさまざまなシナリオで発行される場合があります。これは一般的なすべての MongoDB 例外のキャッチであるため、この例外は他のすべての特定の例外の後に処理されることを確認してください。
+ **`MongoTimeoutException`** — オペレーションがタイムアウトしたときに発行されます。例えば、存在しないクラスターエンドポイントのクエリなどです。
+ **`MongoSocketException`** — ネットワーク関連の問題に対して発行されます。例えば、オペレーション中の突然のネットワーク切断などです。
+ **`MongoSecurityException`** — 認証が失敗した場合に発行されます。例えば、誤った認証情報での接続などです。
+ **`MongoConfigurationException`** — クライアント設定にエラーがある場合に発行されます。例えば、無効な接続文字列の使用などです。

## ステップ 5: コードの実行
<a name="step5-running-code"></a>

次のコードサンプルは、Amazon DocumentDB 接続を作成し、すべてのデータベースを出力します。

```
public static void TestConnection() {
    try (MongoClient mongoClient = makeDbConnection(DATABASE_NAME, DB_USER_NAME, DB_PASSWORD, DB_CLUSTER_ENDPOINT, KEYSTORE_PASSWORD)) {
        List < String > databases = mongoClient.listDatabaseNames().into(new ArrayList < > ());
        System.out.println("Databases: " + databases);
    } catch (MongoException e) {
        System.err.println("MongoDB error: " + e.getMessage());
        throw new RuntimeException(e);
    }
}
```

## 接続のベストプラクティス
<a name="java-connect-best-practices"></a>

以下は、MongoDB Java ドライバーを使用して Amazon DocumentDB に接続するときに考慮すべきベストプラクティスです。
+ クライアントにリソースを解放してもらう必要がなくなった場合は、必ず [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html) を閉じてください。
+ 例外を適切に処理し、適切なエラーログ記録を実装します。
+ 環境変数または を使用して AWS Secrets Manager 、ユーザー名やパスワードなどの機密情報を保存します。

# Java を使用した Amazon DocumentDB での CRUD オペレーションの実行
<a name="java-crud-operations"></a>

このセクションでは、MongoDB Java ドライバーを使用して Amazon DocumentDB で CRUD (作成、読み取り、更新、削除) オペレーションを実行する方法について説明します。

**Topics**
+ [DocumentDB コレクションでのドキュメントの作成と挿入](#creating-inserting)
+ [DocumentDB コレクションからのデータの読み取りと取得](#reading-retrieving)
+ [DocumentDB コレクション内の既存のドキュメントの更新](#updating-documents)
+ [DocumentDB コレクションからのドキュメントの削除](#deleting-documents)
+ [再試行ロジックによるエラー処理](#error-handling)

## DocumentDB コレクションでのドキュメントの作成と挿入
<a name="creating-inserting"></a>

Amazon DocumentDB にドキュメントを挿入すると、コレクションに新しいデータを追加できるようになります。挿入を実行するには、ニーズと使用しているデータの量に応じて、いくつかの方法があります。個々のドキュメントをコレクションに挿入するための最も基本的なメソッドは `insertOne()` です。一度に複数のドキュメントを挿入するには、`insertMany()` メソッドを使用できます。これにより、ドキュメントの配列を 1 回のオペレーションで追加できます。DocumentDB コレクションに多くのドキュメントを挿入するもう 1 つのメソッドは `bulkWrite()` です。このガイドでは、DocumentDB コレクションでドキュメントを作成するためのこれらのすべてのメソッドについて説明します。

**`insertOne()`**

まず、個々のドキュメントを Amazon DocumentDB コレクションに挿入する方法を見てみましょう。単一のドキュメントを挿入するには、`insertOne()` メソッドを使用します。このメソッドは、挿入のために [BsonDocument](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/bson/org/bson/BsonDocument.html) を取得し、新しい挿入されたドキュメントのオブジェクト ID を取得するために使用できる [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/InsertOneResult.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/InsertOneResult.html) オブジェクトを返します。以下のコード例は、コレクションに 1 つのレストランドキュメントを挿入する方法を示しています。

```
Document article = new Document()
    .append("restaurantId", "REST-21G145")
    .append("name", "Future-proofed Intelligent Bronze Hat")
    .append("cuisine", "International")
    .append("rating", new Document()
        .append("average", 1.8)
        .append("totalReviews", 267))
    .append("features", Arrays.asList("Outdoor Seating", "Live Music"));

try {
    InsertOneResult result = collection.insertOne(article);
    System.out.println("Inserted document with the following id: " + result.getInsertedId());
} catch (MongoWriteException e) {
    // Handle duplicate key or other write errors
    System.err.println("Failed to insert document: " + e.getMessage());
    throw e;
} catch (MongoException e) {
    // Handle other MongoDB errors
    System.err.println("MongoDB error: " + e.getMessage());
    throw e;
}
```

`insertOne()` を使用する場合は、適切なエラー処理を必ず含めてください。例えば、上記のコードでは、「`restaurantId`」には一意のインデックスがあるため、このコードを再度実行すると、次の `MongoWriteException` が生成されます。

```
Failed to insert document: Write operation error on server docdbCluster.docdb.amazonaws.com:27017. 
Write error: WriteError{code=11000, message='E11000 duplicate key error collection: Restaurants index: restaurantId_1', details={}}.
```

**insertMany()**

コレクションに多くのドキュメントを挿入する主なメソッドは insertMany() と `bulkWrite()` です。

`insertMany()` メソッドは、1 回のオペレーションで複数のドキュメントを挿入する最も簡単な方法です。ドキュメントのリストを受け入れ、コレクションに挿入します。このメソッドは、互いに独立しており、特別な処理や混合オペレーションを必要としない新しいドキュメントのバッチを挿入する場合に最適です。次のコードは、ファイルから JSON ドキュメントを読み取ってコレクションに挿入する方法を示しています。`insertMany()` 関数は、挿入されたすべてのドキュメントの ID を取得するために使用できる [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/InsertManyResult.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/InsertManyResult.html)`InsertManyResult` オブジェクトを返します。

```
// Read JSON file content
String content = new String(Files.readAllBytes(Paths.get(jsonFileName)));
JSONArray jsonArray = new JSONArray(content);

// Convert JSON articles to Documents
List < Document > restaurants = new ArrayList < > ();
for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject jsonObject = jsonArray.getJSONObject(i);
    Document doc = Document.parse(jsonObject.toString());
    restaurants.add(doc);
}
//insert documents in collection
InsertManyResult result = collection.insertMany(restaurants);

System.out.println("Count of inserted documents: " + result.getInsertedIds().size());
```

**[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/package-summary.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/package-summary.html)**

`bulkWrite()` メソッドを使用すると、複数の書き込みオペレーション (挿入、更新、削除) を 1 つのバッチで実行できます。`bulkWrite()` は、一部のドキュメントを挿入して他のドキュメントを更新するなど、1 つのバッチでさまざまなタイプのオペレーションを実行する必要がある場合に使用できます。`bulkWrite()` は、順序付きと順序なしの 2 種類のバッチ書き込みをサポートしています。
+ *順序付けられたオペレーション* — (デフォルト) Amazon DocumentDB は書き込みオペレーションを順番に処理し、最初に発生したエラーで停止します。これは、後のオペレーションが以前のオペレーションに依存する場合など、オペレーションの順序が重要な場合に役立ちます。ただし、順序付けられたオペレーションは、通常、順序付けられていないオペレーションよりも遅くなります。順序付けられたオペレーションでは、バッチが最初のエラーで停止し、一部のオペレーションが未処理のままになる可能性があるケースに対処する必要があります。
+ *順序付けされていないオペレーション* — Amazon DocumentDB が挿入をデータベース内の 1 回の実行として処理できるようにします。1 つのドキュメントでエラーが発生した場合、オペレーションは残りのドキュメントで続行されます。これは、大量のデータを挿入していて、キーの重複が原因で一部のドキュメントが失敗する可能性のあるデータ移行や一括インポートなど、一部の障害を許容できる場合に特に便利です。順序付けされていないオペレーションでは、一部のオペレーションが成功し、他のオペレーションが失敗する部分的な成功シナリオに対処する必要があります。

`bulkWrite()` メソッドを使用する場合、必須のクラスがいくつかあります。まず、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/WriteModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/WriteModel.html) クラスはすべての書き込みオペレーションのベースクラスとして機能し、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/InsertOneModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/InsertOneModel.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateOneModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateOneModel.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateManyModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateManyModel.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/DeleteOneModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/DeleteOneModel.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/DeleteManyModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/DeleteManyModel.html) などの特定の実装で、さまざまなタイプのオペレーションを処理します。

[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/BulkWriteOptions.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/BulkWriteOptions.html) クラスは、順序付き/順序なしの実行の設定やドキュメントの検証のバイパスなど、一括オペレーションの動作を設定するために必要です。[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/BulkWriteResult.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/BulkWriteResult.html) クラスは、挿入、更新、および削除されたドキュメントの数など、実行結果に関する詳細情報を提供します。

エラー処理では、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoBulkWriteException.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoBulkWriteException.html) クラスには一括オペレーション中の障害に関する情報が含まれているため、 クラスは重要です。一方、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/BulkWriteError.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/BulkWriteError.html) クラスは個々のオペレーションの障害に関する特定の詳細を提供します。次のコードは、1 つの `bulkWrite()` メソッド呼び出しの実行中に、ドキュメントのリストを挿入し、1 つのドキュメントを更新および削除する例を示しています。このコードは、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/BulkWriteOptions.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/BulkWriteOptions.html) および [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/BulkWriteResult.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/bulk/BulkWriteResult.html) の操作方法と、`bulkWrite()` オペレーションの適切なエラー処理も示します。

```
List < WriteModel < Document >> bulkOperations = new ArrayList < > ();
// get list of 10 documents representing 10 restaurants
List < Document > restaurantsToInsert = getSampleData();

for (Document doc: restaurantsToInsert) {
    bulkOperations.add(new InsertOneModel < > (doc));
}
// Update operation
bulkOperations.add(new UpdateOneModel < > (
    new Document("restaurantId", "REST-Y2E9H5"),
    new Document("", new Document("stats.likes", 20))
    .append("", new Document("rating.average", 4.5))));
// Delete operation
bulkOperations.add(new DeleteOneModel < > (new Document("restaurantId", "REST-D2L431")));

// Perform bulkWrite operation
try {
    BulkWriteOptions options = new BulkWriteOptions()
        .ordered(false); // Allow unordered inserts

    BulkWriteResult result = collection.bulkWrite(bulkOperations, options);

    System.out.println("Inserted: " + result.getInsertedCount());
    System.out.println("Updated: " + result.getModifiedCount());
    System.out.println("Deleted: " + result.getDeletedCount());
} catch (MongoBulkWriteException e) {
    System.err.println("Bulk write error occurred: " + e.getMessage());
    // Log individual write errors
    for (BulkWriteError error: e.getWriteErrors()) {
        System.err.printf("Error at index %d: %s (Code: %d)%n", error.getIndex(), error.getMessage(),
            error.getCode());

        // Log the problematic document
        Document errorDoc = new Document(error.getDetails());
        if (errorDoc != null) {
            System.err.println("Problematic document: " + errorDoc);
        }
    }
} catch (Exception e) {
    System.err.println("Error during bulkWrite: " + e.getMessage());
}
```

**再試行可能な書き込み**

MongoDB とは異なり、Amazon DocumentDB は再試行可能な書き込みをサポートしていません。そのため、特にネットワークの問題や一時的なサービス利用不能を処理するために、アプリケーションにカスタム再試行ロジックを実装する必要があります。適切に実装された再試行戦略では、通常、再試行間の遅延を増やし、再試行の合計数を制限します。エラー処理を使用して再試行ロジックを構築するコードサンプルについては、以下の [再試行ロジックによるエラー処理](#error-handling) を参照してください。

## DocumentDB コレクションからのデータの読み取りと取得
<a name="reading-retrieving"></a>

Amazon DocumentDB でのドキュメントのクエリは、データを正確に取得して操作できるいくつかの主要なコンポーネントを中心に展開されます。[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#find()](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#find()) メソッドは、MongoDB Java ドライバーの基本的なクエリ API です。これにより、フィルタリング、ソート、結果の射影のための多数のオプションを使用して、複雑なデータ取得が可能になります。`find()` メソッドに加えて、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Filters.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Filters.html) と [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/FindIterable.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/FindIterable.html) は、MongoDB Java ドライバーでのクエリオペレーションの構成要素を提供する他の 2 つの基本的なコンポーネントです。

`Filters` クラスは、クエリフィルターを構築するための流暢な API を提供する MongoDB Java ドライバーのユーティリティクラスです。このクラスは、さまざまなクエリ条件を表す `Bson` オブジェクトのインスタンスを作成する静的ファクトリメソッドを提供します。最も一般的に使用されるメソッドには、等価比較では `eq()`、数値比較では `gt()`、`lt()`、`gte()`、`lte()`、複数の条件の組み合わせでは `and()`、`or()`、配列メンバーシップテストでは `in()`、`nin()`、パターンマッチングでは `regex()` が含まれます。クラスは、タイプセーフであるように設計されており、raw ドキュメントベースのクエリと比較してコンパイル時のチェックに優れているため、Java アプリケーションで DocumentDB クエリを構築するための推奨アプローチです。エラー処理は堅牢で、無効なフィルター構造には明確な例外がスローされます。

`FindIterable` は、 `find()` メソッドの結果を処理するように設計された特殊なインターフェイスです。クエリ実行を改良および制御するための豊富なメソッドのセットを提供し、メソッド連鎖のための流暢な API を提供します。インターフェイスには、返されるドキュメントの数の制限では `limit()`、ページ分割では `skip()`、結果の順序付けでは `sort()`、特定のフィールドの選択では `projection()`、インデックスの選択では `hint()` など、必須のクエリ変更メソッドが含まれています。`FindIterable` のバッチ、スキップ、および制限オペレーションは、データベースからドキュメントを取得して処理する方法を制御するのに役立つ重要なページ分割およびデータ管理ツールです。

バッチ処理 (`batchSize`) は、1 回のネットワークラウンドトリップで DocumentDB がクライアントに返すドキュメントの数を制御します。バッチサイズを設定すると、DocumentDB は一致するすべてのドキュメントを一度に返すのではなく、指定されたバッチサイズのグループで返します。

スキップを使用すると、結果の開始点をオフセットできます。基本的には、一致を返す前に、指定した数のドキュメントをスキップするように DocumentDB に指示します。例えば、`skip(20)` は一致する最初の 20 個のドキュメントをバイパスします。これは、後続の結果ページを取得するページ分割シナリオで一般的に使用されます。

制限は、クエリから返すことができるドキュメントの総数を制限します。`limit(n)` を指定すると、データベースにより多くの一致がある場合でも、DocumentDB は「n」ドキュメントを返した後でドキュメントの返しを停止します。

`FindIterable` は、Amazon DocumentDB からドキュメントを取得するときに、イテレーターパターンとカーソルパターンの両方をサポートします。イテレーターとして `FindIterable` を使用する利点は、ドキュメントの遅延ロードを許可し、アプリケーションから要求された場合にのみドキュメントを取得することです。イテレーターを使用するもう 1 つの利点は、クラスターへの接続を維持する責任がないため、接続を明示的に閉じる必要がないことです。

`FindIterable` は、Amazon DocumentDB クエリを操作するときにカーソルパターンを使用できるようにする [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCursor.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCursor.html) のサポートも提供します。`MongoCursor` は、データベースオペレーションとリソース管理を制御する MongoDB Java ドライバー固有の実装です。`AutoCloseable` インターフェイスを実装しているため、try-with-resources ブロックによる明示的なリソース管理が可能になります。これは、データベース接続を適切に閉じ、サーバーリソースを解放するために不可欠です。デフォルトでは、カーソルは 10 分でタイムアウトし、DocumentDB はこのタイムアウト動作を変更するオプションを提供しません。バッチ処理されたデータを使用する場合は、カーソルがタイムアウトする前に、必ず次のデータのバッチを取得してください。`MongoCursor` を使用する際の 1 つの重要な考慮事項は、リソースリークを防ぐために明示的な閉鎖が必要であることです。

このセクションでは、`find()`、`Filters`、および `FindIterable` の例をいくつか示します。

次のコード例は、`find()` を使用して、「restaurantId」フィールドを使用して単一のドキュメントを取得する方法を示しています。

```
Document filter = new Document("restaurantId", "REST-21G145");
Document result = collection.find(filter).first();
```

`Filters` を使用するとコンパイル時のエラーチェックが向上しますが、Java ドライバーでは `find()` メソッドで直接 `Bson` フィルターを指定することもできます。次のコード例では、`Bson` ドキュメントを `find()` に渡します。

```
result = collection.find(new Document("$and", Arrays.asList(
    new Document("rating.totalReviews", new Document("$gt", 1000)),
    new Document("priceRange", "$$"))))
```

次のコード例は、`find()` で `Filters` クラスを使用するいくつかの例を示しています。

```
FindIterable < Document > results;

// Exact match
results = collection.find(Filters.eq("name", "Thai Curry Palace"));

// Not equal
results = collection.find(Filters.ne("cuisine", "Thai"));

// find an element in an array
results = collection.find(Filters.in("features", Arrays.asList("Private Dining")));

// Greater than
results = collection.find(Filters.gt("rating.average", 3.5));

// Between (inclusive)
results = collection.find(Filters.and(
    Filters.gte("rating.totalReviews", 100),
    Filters.lte("rating.totalReviews", 200)));
// AND
results = collection.find(Filters.and(
    Filters.eq("cuisine", "Thai"),
    Filters.gt("rating.average", 4.5)));

// OR
results = collection.find(Filters.or(
    Filters.eq("cuisine", "Thai"),
    Filters.eq("cuisine", "American")));


// All document where the Field exists
results = collection.find(Filters.exists("michelin"));

// Regex
results = collection.find(Filters.regex("name", Pattern.compile("Curry", Pattern.CASE_INSENSITIVE)));

// Find all document where the array contain the list of value regardless of its order
results = collection.find(Filters.all("features", Arrays.asList("Private Dining", "Parking")));

// Array size
results = collection.find(Filters.size("features", 4));
```

次の例は、`FindIterable` オブジェクトで `sort()`、`skip()`、`limit()`、および `batchSize()` のオペレーションを連鎖する方法を示しています。これらのオペレーションがどのように提供されるかの順序は、クエリのパフォーマンスに影響します。ベストプラクティスとして、これらのオペレーションの順序は `sort()`、`projection()`、`skip()`、`limit()` および `batchSize()` である必要があります。

```
FindIterable < Document > results = collection.find(Filters.gt("rating.totalReviews", 1000))
    // Sorting
    .sort(Sorts.orderBy(
        Sorts.descending("address.city"),
        Sorts.ascending("cuisine")))
    // Field selection
    .projection(Projections.fields(
        Projections.include("name", "cuisine", "priceRange"),
        Projections.excludeId()))

    // Pagination
    .skip(20)
    .limit(10)
    .batchSize(2);
```

次の例のコードは、`FindIterable` でのイテレーターを作成を示しています。Java の `forEach` コンストラクトを使用して、結果セットをトラバースします。

```
collection.find(Filters.eq("cuisine", "American")).forEach(doc -> System.out.println(doc.toJson()));
```

最後の `find()` コード例では、`cursor()` を使用してドキュメントを取得する方法を示しています。試行ブロックにカーソルが作成され、コードが試行ブロックを終了するとカーソルが閉じられます。

```
try (MongoCursor < Document > cursor = collection.find(Filters.eq("cuisine", "American"))
    .batchSize(25)
    .cursor()) {
    while (cursor.hasNext()) {
        Document doc = cursor.next();
        System.out.println(doc.toJson());
    }
} // Cursor automatically closed
```

## DocumentDB コレクション内の既存のドキュメントの更新
<a name="updating-documents"></a>

Amazon DocumentDB は、既存のドキュメントを変更し、存在しないときに新しいドキュメントを挿入するための柔軟で強力なメカニズムを提供します。MongoDB Java ドライバーには、1 つのドキュメントの更新のための `updateOne()`、複数のドキュメントの更新のための `updateMany()`、完全なドキュメント置換のための `replaceOne()` など、複数の更新メソッドが用意されています。これらの 3 つのメソッドに加えて、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Updates.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Updates.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateOptions.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateOptions.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/UpdateResult.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/UpdateResult.html) は、MongoDB Java ドライバーでの更新オペレーションの構成要素を提供するその他の基本的なコンポーネントです。

MongoDB Java ドライバーの `Updates` クラスは、更新演算子を作成するための静的ファクトリメソッドを提供するユーティリティクラスです。これは、タイプセーフで読み取り可能な方法で更新オペレーションを構築するためのプライマリビルダーとして機能します。`set()`、`unset()`、`inc()` などの基本的なメソッドでは、ドキュメントを直接変更できます。このクラスの能力は、複数の更新オペレーションをアトミックに実行できる `Updates.combine()` メソッドを使用して複数のオペレーションを組み合わせると明らかになり、データ整合性が確保されます。

`UpdateOptions` は、ドキュメント更新オペレーションに不可欠なカスタマイズ機能を提供する MongoDB の Java ドライバーの強力な設定クラスです。このクラスの 2 つの重要な点は、更新オペレーションのアップサートと配列フィルターのサポートを提供することです。`upsert(true)` を介して有効になっているアップサート機能を使用すると、更新オペレーション中に一致するドキュメントが見つからなかった場合に、新しいドキュメントを作成できます。`arrayFilters()` を通じて、更新オペレーションは特定の基準を満たす配列要素を正確に更新できます。

MongoDB の Java ドライバーの `UpdateResult` は、更新オペレーションの結果を詳述するフィードバックメカニズムを提供します。このクラスは、更新基準に一致するドキュメントの数 (`matchedCount`)、実際に変更されたドキュメントの数 (`modifiedCount`)、およびアップサートされたドキュメントに関する情報 (`upsertedId`) の 3 つの主要なメトリクスをカプセル化します。これらのメトリクスを理解することは、適切なエラー処理、更新オペレーションの検証、アプリケーションのデータ整合性の維持に不可欠です。

### 1 つのドキュメントを更新して置き換える
<a name="update-single-doc"></a>

DocumentDB では、updateOne() メソッドを使用して 1 つのドキュメントを更新できます。このメソッドは、通常は `Filters` クラスによって提供されるフィルターパラメータを使用して、更新するドキュメントを識別し、どのフィールド (複数可) を更新するかを決定する `Updat`e パラメータと、更新のさまざまなオプションを設定するオプションの `UpdateOptions` パラメータを使用します。`updateOne()` メソッドを使用すると、選択基準に一致する最初のドキュメントのみが更新されます。次のコード例では、1 つのドキュメントの 1 つのフィールドを更新します。

```
collection.updateOne(Filters.eq("restaurantId", "REST-Y2E9H5"),
    Updates.set("name", "Amazing Japanese sushi"));
```

1 つのドキュメント内の複数のフィールドを更新するには、次の例に示すように、`Update.combine()` で `updateOne()` を使用します。この例は、ドキュメント内の配列に項目を追加する方法も示しています。

```
List<Bson> updates = new ArrayList<>();
// Basic field updates
updates.add(Updates.set("name", "Shanghai Best"));
// Array operations
updates.add(Updates.addEachToSet("features", Arrays.asList("Live Music")));
// Counter updates
updates.add(Updates.inc("rating.totalReviews", 10));
// Combine all updates
Bson combinedUpdates = Updates.combine(updates);
// Execute automic update with one call
collection.updateOne(Filters.eq("restaurantId","REST-1J83NH"), combinedUpdates);
```

次のコード例は、データベース内のドキュメントを更新する方法を示しています。指定されたドキュメントが存在しない場合、オペレーションはそれを代わりに新しいドキュメントとして自動的に挿入します。このコードは、`UpdateResult` オブジェクトを介して利用可能なメトリクスの使用方法も示します。

```
Bson filter = Filters.eq("restaurantId", "REST-0Y9GL0");
Bson update = Updates.set("cuisine", "Indian");
// Upsert operation
UpdateOptions options = new UpdateOptions().upsert(true);
UpdateResult result = collection.updateOne(filter, update, options);

if (result.getUpsertedId() != null) {
   	System.out.println("Inserted document with _id: " + result.getUpsertedId());
} else {
    	System.out.println("Updated " + result.getModifiedCount() + " document(s)");
}
```

次のコード例は、個々のフィールドを更新するのではなく、`replaceOne()` メソッドを使用して既存のドキュメントを新しいドキュメントと完全に置き換える方法を示しています。`replaceOne()` メソッドはドキュメント全体を上書きし、元の `_id` フィールドのみを保持します。複数のドキュメントがフィルター条件に一致する場合、最初に検出されたドキュメントのみが置き換えられます。

```
Document newDocument = new Document()
                .append("restaurantId", "REST-0Y9GL0")
                .append("name", "Bhiryani Adda")
                .append("cuisine", "Indian")
                .append("rating", new Document()
                        .append("average", 4.8)
                        .append("totalReviews", 267))
                .append("features", Arrays.asList("Outdoor Seating", "Live Music"));

UpdateResult result = collection.replaceOne(
                    Filters.eq("restaurantId", "REST-0Y9GL0"),
                    newDocument);
System.out.printf("Modified %d document%n", result.getModifiedCount());
```

### 複数のドキュメントの更新
<a name="update-multiple-docs"></a>

コレクション内の複数のドキュメントを同時に更新する方法は 2 つあります。`updateMany()` メソッドを使用するか、`bulkWrite()` メソッドの [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateManyModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/UpdateManyModel.html) を使用できます。`updateMany()` メソッドは、フィルターパラメータを使用して更新するドキュメントを選択し、`Update` パラメータを使用して更新するフィールドを識別し、オプションの `UpdateOptions` パラメータを使用して更新オプションを指定します。

次のコード例は、`updateMany()` メソッドの使用を示しています。

```
Bson filter = Filters.and(
    Filters.in("features", Arrays.asList("Private Dining")),
    Filters.eq("cuisine", "Thai"));
UpdateResult result1 = collection.updateMany(filter, Updates.set("priceRange", "$$$"));
```

次のコード例は、同じ更新を使用する `bulkWrite()` メソッドを示しています。

```
BulkWriteOptions options = new BulkWriteOptions().ordered(false);
List < WriteModel < Document >> updates = new ArrayList < > ();
Bson filter = Filters.and(
    Filters.in("features", Arrays.asList("Private Dining")),
    Filters.eq("cuisine", "Indian"));
Bson updateField = Updates.set("priceRange", "$$$");
updates.add(new UpdateManyModel < > (filter, updateField));
BulkWriteResult result = collection.bulkWrite(updates, options);
System.out.printf("Modified %d document%n", result.getModifiedCount());
```

## DocumentDB コレクションからのドキュメントの削除
<a name="deleting-documents"></a>

MongoDB Java ドライバーは、1 つのドキュメントの削除のために `deleteOne()`、および特定の条件に一致する複数のドキュメントの削除のために `deleteMany()` を提供します。更新と同様に、削除オペレーションは `bulkWrite()` メソッドでも使用できます。`deleteOne()` と `deleteMany()` はどちらも、削除されたドキュメントの数など、オペレーションの結果に関する情報を提供する [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/DeleteResult.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/result/DeleteResult.html) オブジェクトを返します。`deleteMany()` を使用して複数のドキュメントを削除する例を次に示します。

```
Bson filter = Filters.and(
    Filters.eq("cuisine", "Thai"),
    Filters.lt("rating.totalReviews", 50));
DeleteResult result = collection.deleteMany(filter);
System.out.printf("Deleted %d document%n", result.getDeletedCount());
```

## 再試行ロジックによるエラー処理
<a name="error-handling"></a>

Amazon DocumentDB の堅牢なエラー処理戦略では、エラーを再試行可能 (ネットワークタイムアウト、接続の問題など) と再試行不可能 (認証の失敗、無効なクエリなど) に分類する必要があります。再試行する必要があるエラーによるオペレーションの失敗については、各再試行間の遅延と最大再試行回数を実装する必要があります。CRUD オペレーションは、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoException.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoException.html) とそのサブクラスをキャッチする try-catch ブロックにある必要があります。さらに、運用上の可視性のためにエラーのモニタリングとログ記録を含める必要があります。以下は、再試行エラー処理を実装する方法を示すサンプルコードです。

```
int MAX_RETRIES = 3;
int INITIAL_DELAY_MS = 1000;
int retryCount = 0;

while (true) {
    try {
        crud_operation(); //perform crud that will throw MongoException or one of its subclass
        break;
    } catch (MongoException e) {
        if (retryCount < MAX_RETRIES) {
            retryCount++;
            long delayMs = INITIAL_DELAY_MS * (long) Math.pow(2, retryCount - 1);
            try {
                TimeUnit.MILLISECONDS.sleep(delayMs);
            } catch (InterruptedException t) {
                Thread.currentThread().interrupt();
                throw new RuntimeException("Retry interrupted", t);
            }
            continue;
        } else
            throw new RuntimeException("Crud operation failed", e);
    }
}
```

# Java による Amazon DocumentDB でのインデックス管理
<a name="index-management-java"></a>

インデックスを使用すると、Amazon DocumentDB コレクションからデータを効率的に取得できます。インデックスがない場合、DocumentDB はコレクション内のすべてのドキュメントをスキャンして、特定のクエリを満たす結果を返す必要があります。このトピックでは、MongoDB Java ドライバーを使用してインデックスを作成、削除、および一覧表示する方法について説明します。また、クエリで特定のインデックスが使用されているかどうかを判断する方法と、特定のインデックスを使用するように Amazon DocumentDB にヒントを与える方法について説明します。

**Topics**
+ [インデックスの作成](#creating-indexes)
+ [インデックスの削除](#dropping-indes)
+ [インデックス選択の決定とインデックスヒントの提供](#w2aac43b9b7c17c13)

Amazon DocumentDB は、多くのタイプのインデックスをサポートしています。サポートされているすべてのインデックスの包括的な概要については、この [ブログ記事](https://aws.amazon.com/blogs/database/how-to-index-on-amazon-documentdb-with-mongodb-compatibility/) を参照してください。

## Java によるインデックスの作成
<a name="creating-indexes"></a>

MongoDB Java ドライバーを使用して Amazon DocumentDB でインデックスを作成するメカニズムには、`runCommand()` を通じたもの、および単一のインデックスでの `createIndex()` メソッドまたは複数のインデックスでの `createIndexes()` メソッドのいずれかによるものの 2 つがあります。`createIndex()` および `createIndexes()` メソッドを使用する理由の 1 つは、インデックス作成に関連する特定のエラーをキャッチすることで、より良いエラー処理を構築できることです。これらのメソッドを `runCommand()` で使用するもう 1 つの理由は、MongDB Java ドライバーがインデックスの作成と操作のための豊富なサポートクラスを提供することです。これらのサポートクラスは、`createIndex()` または `createIndexes()` メソッドを使用している場合にのみ使用できることに注意してください。3 つのサポートクラスがあります。
+ **[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Indexes.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Indexes.html)** — このクラスは、さまざまなタイプのインデックスを作成するための静的ファクトリメソッドを提供するユーティリティクラスとして機能します。これにより、複雑なインデックス定義を作成するプロセスが簡素化され、一般的に他のインデックス関連クラスと組み合わせて使用されます。
+ **[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexModel.html)** — これは、インデックスキー定義とそのオプションの両方をカプセル化する基本的なクラスです。これは、インデックスを作成する内容 (キー) とインデックスを作成する方法 (オプション) を組み合わせた完全なインデックス仕様を表します。このクラスは、`createIndexes()` メソッドに渡すことができるインデックス仕様のコレクションを定義できるため、複数のインデックスを同時に作成する場合に特に便利です。
+ **[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexOptions.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexOptions.html)** — これは、インデックスの動作をカスタマイズするための豊富なメソッドのセットを提供する包括的な設定クラスです。これには、一意のインデックス、スパースインデックス、有効期限 (TTL)、および部分フィルター式の設定が含まれます。メソッドチェーンを使用すると、バックグラウンドインデックスの構築や一意の制約など、複数のオプションを設定できます。

**単一のインデックスを作成する**

この例では、バックグラウンドで `createIndex(`) メソッドを使用して単一のインデックスを作成する方法を示します。バックグラウンドインデックスとフォアグラウンドインデックスの作成については、「[インデックスビルドのタイプ](managing-indexes.md#index-build-types)」を参照してください。次のコード例では、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexOptions.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexOptions.html) を使用して、バックグラウンドで「unique\$1restaurantId\$1idx」という名前の一意のインデックスを作成します。その後、この `IndexOptions` オブジェクトは `createIndex()` メソッドに渡されます。

```
collection.createIndex(
    Indexes.ascending("restaurantId"),
    new IndexOptions()
        .unique(true)
        .name("unique_restaurantId_idx")
        .background(true));
```

**複数のインデックスを作成する**

この例では、`createIndexes()` メソッドを使用して複数のインデックスを作成します。まず、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexModel.html) オブジェクトを使用して各インデックスのオプションを構築し、次に `IndexModel` オブジェクトのリストを `createIndexes()` メソッドに渡します。次のコード例は、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Indexes.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/Indexes.html) ユーティリティクラスを使用して複合インデックスを作成する方法を示しています。このクラスは、昇順または降順のソート順序を使用してインデックスを作成するかどうかを指定するためにも使用されます。複数のインデックスを作成した後、`listIndexes()` メソッドを呼び出してインデックスの作成を検証します。

```
// Single Field Index on cuisine
IndexModel singleIndex = new IndexModel(
    Indexes.ascending("cuisine"),
    new IndexOptions().name("cuisine_idx"));

// Compound Index
IndexModel compoundIndex = new IndexModel(
    Indexes.compoundIndex(
        Indexes.ascending("address.state"),
        Indexes.ascending("priceRange")),
    new IndexOptions().name("location_price_idx"));

// Build a list of IndexModel for the indexes
List < IndexModel > indexes = Arrays.asList(
    singleIndex,
    compoundIndex
);

collection.createIndexes(indexes);

// Verify created indexes
collection.listIndexes().forEach(index - > System.out.println("Created index: " + index.toJson()));
```

**スパースインデックスと部分インデックスを作成する**

この例では、インデックスのタイプごとに [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexModel.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/IndexModel.html) を作成して、スパースインデックスと部分インデックスを作成する方法を示します。

```
// Sparse Index Model, this will identify only those documents that have a
// michelin star rating
IndexModel sparseIndex = new IndexModel(
    Indexes.ascending("michelin.star"),
    new IndexOptions()
    .name("michelin_sparse_idx")
    .sparse(true));

// Partial Index Model where the restaurant is active and has a rating of 4 and above
IndexModel partialIndex = new IndexModel(
    Indexes.ascending("rating.average"),
    new IndexOptions()
    .name("high_rated_active_idx")
    .partialFilterExpression(
        Filters.and(
            Filters.eq("isActive", true),
            Filters.gte("rating.average", 4.0))));
```

**テキストインデックスを作成する**

この例では、テキストインデックスを作成する方法を示します。コレクションでは 1 つのテキストインデックスのみが許可されますが、1 つのテキストインデックスを複数のフィールドをカバーする複合インデックスにすることができます。テキストインデックスで複数のフィールドを使用する場合、インデックス内の各フィールドに重みを割り当てることもできます。配列フィールドのテキストインデックスは Amazon DocumentDB ではサポートされていません。複合テキストインデックスでは最大 30 個のフィールドを使用できますが、重みを割り当てることができるフィールドは 3 つだけです。

```
IndexModel textIndex = new IndexModel(
    new Document()
    .append("name", "text")
    .append("description", "text")
    .append("cuisine", "text"),
    new IndexOptions()
    .name("restaurant_text_idx")
    .weights(new Document()
        .append("name", 10) // Restaurant name gets highest weight
        .append("description", 5) // Description get medium weight
        .append("cuisine", 2) // Cuisine type gets low weight
    ));

collection.createIndex(textIndex.getKeys(), textIndex.getOptions());
```

**`runCommand()` を使用してインデックスを作成する**

Amazon DocumentDB は、インデックスの作成にかかる時間を短縮するための並列インデックス作成をサポートしています。並列インデックス作成は、複数の同時ワーカーを使用します。インデックスの作成に使用されるデフォルトのワーカーは 2 つです。この [ブログ記事](https://aws.amazon.com/blogs/database/unlock-the-power-of-parallel-indexing-in-amazon-documentdb/) では、並列インデックス作成について詳しく説明します。現在、MongDB Java ドライバーは、`createIndex()` または `createIndexes()` を使用しているときにワーカーオプションの指定をサポートしていないため、ワーカーを指定する唯一の方法は `runCommand` を使用することです。次のコード例は、`runCommand` を使用して、ワーカーを 4 つに増やすインデックスを作成する方法を示しています。

```
Document command = new Document("createIndexes", "Restaurants")
    .append("indexes", Arrays.asList(
        new Document("key", new Document("name", 1))
        .append("name", "restaurant_name_idx")
        .append("workers", 4) // Specify number of workers
    ));

Document commendResult = connectedDB.runCommand(command);
```

## インデックスの削除
<a name="dropping-indes"></a>

MongoDB Java ドライバーは、さまざまなシナリオや好みに応じて、インデックスを削除する複数のメソッドを提供します。名前で、またはキー仕様でインデックスを削除するか、すべてのインデックスを一度に削除できます。メソッド `dropIndex()` と `dropIndexes()` をコレクションオブジェクトで呼び出して、インデックスを削除できます。名前でインデックスを削除する場合は、特に複合インデックスまたは自動生成されたインデックスの場合、常に直感的とは限らない正しいインデックス名を使用してください。存在しないインデックスを削除しようとすると、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoCommandException.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoCommandException.html) になります。コレクション内でドキュメントの一意性が確保されるため、`default _id` インデックスを削除することはできません。

次のコード例は、インデックスが作成されたフィールド名を指定するか、すべてのインデックスを削除することで、インデックスを削除する方法を示しています。

```
String indexName = "unique_restaurantId_idx";
Document keys = new Document("cuisine", 1);
// Drop index by name
collection.dropIndex(indexName);
            
// Drop index by keys
collection.dropIndex(keys);
            
// Drop all indexes
collection.dropIndexes();
```

複数のキーを使用してインデックスを削除する場合は、指定されたすべてのキーを含む複合インデックスがあり、キーの順序が正しいことを確認してください。上記のインデックス作成サンプルコード例は、「cuisine」および 機能の複合キーを示しています。その複合キーを削除しようとしても、その順序が作成で使用された順序ではない場合、MongoCommnadException エラーが次のように発生します。

```
Document keys = new Document("features", 1)
    .append("cuisine", 1);
try {
    // Drop index by keys
    collection.dropIndex(keys);
    System.out.println("Successfully dropped index with keys: " + keys.toJson());

} catch (MongoCommandException commErr) {
    System.out.println("Error dropping index: " + commErr.getErrorMessage());
    throw new RuntimeException("MongoCommandException was thrown while dropping index", commErr);
}
```

次のエラーが表示されます。

```
Error dropping index: Cannot drop index: index not found.
Tests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.819 sec <<< FAILURE!
com.amazon.docdb.guide.DocDBGuideTest.testindexGuide()  Time elapsed: 0.817 sec  <<< FAILURE!
org.opentest4j.AssertionFailedError: Unexpected exception thrown: java.lang.RuntimeException: MongoCommandException was thrown while dropping index
```

## インデックス選択の決定とインデックスヒントの提供
<a name="w2aac43b9b7c17c13"></a>

Amazon DocumentDB の説明機能を操作することは、クエリのパフォーマンスとインデックスの使用を理解するために不可欠です。クエリを実行するときは、`explain()` メソッドを追加して、どのインデックスが使用されているか (ある場合) など、クエリプランに関する詳細情報を取得できます。`explain()` 出力は、クエリ実行ステージ、調査されたドキュメントの数、および各ステージにかかる時間に関するインサイトを提供します。この情報は、特定のインデックスが効果的に使用されているかどうか、またはクエリが別のインデックス構造から恩恵を受けることができるかどうかを識別するのに非常に役立ちます。

`explain()` メソッドは、`find()` メソッドと連鎖できます。`explain()` メソッドは、`explain()` によって返される詳細レベルを決定するオプションの [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/ExplainVerbosity.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/ExplainVerbosity.html) 列挙値を取ることができます。現時点では、`EXECUTION_STATS` および `QUERY_PLANNER` 列挙子のみが DocumentDB でサポートされています。次のコード例は、特定のクエリのクエリプランナーを取得する方法を示しています。

```
// Query we want to analyze
Document query = new Document()
    .append("cuisine", "Thai")
    .append("rating.average", new Document("$gte", 4.0));


Document allPlansExplain = collection.find(query).explain(ExplainVerbosity.QUERY_PLANNER);
System.out.println("All Plans Explain:\n" + allPlansExplain.toJson());
```

クエリプランナーの詳細レベルには、次の JSON ドキュメントが返されます。

```
{
  "queryPlanner": {
    "plannerVersion": 1,
    "namespace": "ProgGuideData.Restaurants",
    "winningPlan": {
      "stage": "IXSCAN",
      "indexName": "cuisine_idx",
      "direction": "forward"
    }
  },
  "serverInfo": {
    "host": "guidecluster3",
    "port": 27017,
    "version": "5.0.0"
  },
  "ok": 1,
  "operationTime": {
    "$timestamp": {
      "t": 1739221668,
      "i": 1
    }
  }
}
```

Amazon DocumentDB が特定のインデックスを使用するように影響または強制するには、いくつかのオプションがあります。`hint()` および `hintString()` メソッドでは、クエリに使用するインデックスを明示的に指定することで、クエリオプティマイザのデフォルトのインデックス選択動作を上書きできます。DocumentDB のクエリオプティマイザは通常、インデックスの選択に適切な選択を行いますが、歪んだデータを扱うときやインデックスのパフォーマンスをテストするときなど、特定のインデックスを `hint()` または `hintString()` で強制することが有益なシナリオがあります。

次のコード例では、上記のコードで実行されたのと同じクエリに対して複合インデックス「cuisine\$1features\$1idx」を強制的に使用します。

```
// Query we want to analyze
Document query = new Document()
    .append("cuisine", "Thai")
    .append("rating.average", new Document("$gte", 4.0));

List < Document > queryDocs = new ArrayList < > ();
collection.find(query).hintString("cuisine_features_idx").forEach(doc - > queryDocs.add(doc));
```

# Amazon DocumentDB と Java を使用したイベント駆動型プログラミング
<a name="event-driven-programming"></a>

Amazon DocumentDB のコンテキストにおけるイベント駆動型プログラミングは、データベースの変更が後続のビジネスロジックとプロセスをトリガーする主要なイベントジェネレーターとして機能する強力なアーキテクチャパターンを表します。DocumentDB コレクションでレコードが挿入、更新、または削除されると、これらの変更はさまざまなダウンストリームプロセス、通知、またはデータ同期タスクを自動的に開始するイベントとして機能します。このパターンは、複数のアプリケーションまたはサービスがデータ変更にリアルタイムで対応する必要がある最新の分散システムでは特に重要です。DocumentDB でイベント駆動型プログラミングを実装する主なメカニズムは、変更ストリームです。

**注記**  
このガイドでは、作業中のコレクションで変更ストリームを有効にしていることを前提としています。コレクションで変更ストリームを有効にする方法については、「[Amazon DocumentDB を用いた変更ストリームの使用](change_streams.md)」を参照してください。

**Java アプリケーションからの変更ストリームの使用**

MongoDB の Java ドライバーの `watch()` メソッドは、Amazon DocumentDB でリアルタイムのデータ変更をモニタリングするための主要なメカニズムです。`watch()` メソッドは、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html)、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoDatabase.html#watch(com.mongodb.client.ClientSession,java.lang.Class)](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoDatabase.html#watch(com.mongodb.client.ClientSession,java.lang.Class))、および [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#watch()](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#watch()) オブジェクトによって呼び出すことができます。

`watch()` メソッドは、更新の完全なドキュメント検索、信頼性のための再開トークンとタイムスタンプの提供、変更をフィルタリングするためのパイプライン集約ステージなど、さまざまな設定オプションをサポートする [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)) のインスタンスを返します。

[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)) はコア Java インターフェイス `Iterable` を実装しており、`forEach()` で使用できます。`forEach()` を使用してイベントをキャプチャするには、変更されたイベントを処理する `forEach()` にコールバック関数を渡します。次のコードスニペットは、コレクションで変更ストリームを開いて変更イベントのモニタリングを開始する方法を示しています。

```
ChangeStreamIterable < Document > iterator = collection.watch();
iterator.forEach(event - > {
    System.out.println("Received a change: " + event);
});
```

すべての変更イベントを通過するもう 1 つの方法は、クラスターへの接続を維持し、発生時に新しい変更イベントを継続的に受信するカーソルを開くことです。変更ストリームカーソルを取得するには、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)) オブジェクトの `cursor()` メソッドを使用します。次のコード例は、カーソルを使用して変更イベントをモニタリングする方法を示しています。

```
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) {
    System.out.println(cursor.tryNext());
}
```

ベストプラクティスとして、 try-with-resource ステートメントで [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoChangeStreamCursor.html#getResumeToken()](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoChangeStreamCursor.html#getResumeToken()) を作成するか、カーソルを手動で閉じます。[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)) で `cursor()` メソッドを呼び出すと、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/ChangeStreamDocument.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/ChangeStreamDocument.html) オブジェクト上に作成された `MongoChangeStreamCursor` が返されます。

[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/ChangeStreamDocument.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/ChangeStreamDocument.html) クラスは、ストリーム内の個々の変更イベントを表す重要なコンポーネントです。これには、オペレーションタイプ (挿入、更新、削除、置換)、ドキュメントキー、名前空間情報、および使用可能な場合の完全なドキュメントコンテンツなど、各変更に関する詳細情報が含まれます。クラスは、変更のタイプを決定する `getOperationType()`、完全なドキュメント状態にアクセスする `getFullDocument()`、変更されたドキュメントを識別する `getDocumentKey()` など、変更イベントのさまざまな側面にアクセスするメソッドを提供します。

[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/ChangeStreamDocument.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/ChangeStreamDocument.html) オブジェクトは、再開トークンと変更イベントという、時刻の 2 つの重要な情報を提供します。

DocumentDB 変更ストリームの再開トークンと時間ベースのオペレーションは、継続性を維持し、履歴データアクセスを管理するための重要なメカニズムを提供します。再開トークンは、変更イベントごとに生成される一意の識別子であり、切断または障害後にアプリケーションが特定のポイントから変更ストリーム処理を再開できるようにするブックマークとして機能します。変更ストリームカーソルを作成すると、`resumeAfter()` オプションを使用して以前に保存した再開トークンを使用できます。これにより、ストリームは最初から開始したり、イベントを失ったりするのではなく、中断した場所から続行できます。

変更ストリームの時間ベースのオペレーションは、変更イベントモニタリングの開始点を管理するためのさまざまなアプローチを提供します。`startAtOperationTime()` オプションを使用すると、特定のタイムスタンプ以降に発生した変更の監視を開始できます。これらの時間ベースの機能は、履歴データ処理、ポイントインタイムリカバリ、またはシステム間の同期を必要とするシナリオで特に役立ちます。

次のコード例は、挿入ドキュメントに関連付けられたイベントを取得し、再開トークンをキャプチャしてから、挿入イベントの後にイベントのモニタリングを開始するトークンを提供します。イベントは更新イベントに関連付けられ、更新が発生したクラスター時間を取得し、そのタイムスタンプをさらなる処理の開始点として使用します。

```
BsonDocument resumeToken;
BsonTimestamp resumeTime;

try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) {
    System.out.println("****************** Insert Document *******************");
    ChangeStreamDocument < Document > insertChange = cursor.tryNext();
    resumeToken = insertChange.getResumeToken();
    printJson(cursor.tryNext());
}
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch()
    .resumeAfter(resumeToken)
    .cursor()) {
    System.out.println("****************** Update Document *******************");
    ChangeStreamDocument < Document > insertChange = cursor.tryNext();
    resumeTime = insertChange.getClusterTime();
    printJson(cursor.tryNext());
}
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch()
    .startAtOperationTime(resumeTime)
    .cursor()) {
    System.out.println("****************** Delete Document *******************");
    printJson(cursor.tryNext());
  }
```

デフォルトで、変更の更新イベントには、ドキュメント全体は含まれず、加えられた変更のみが含まれます。更新した完全なドキュメントにアクセスする必要がある場合は、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/ChangeStreamIterable.html#startAtOperationTime(org.bson.BsonTimestamp)) オブジェクトで `fullDocument()` メソッドを呼び出すことができます。更新イベントに対して完全なドキュメントが返されるように要求すると、変更ストリームへの呼び出しが行われた時点で存在するドキュメントが返されることに注意してください。

このメソッドは、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/FullDocument.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/client/model/changestream/FullDocument.html) 列挙型をパラメータとして受け取ります。現在、Amazon DocumentDB は DEFAULT および `UPDATE_LOOKUP` 値のみをサポートしています。次のコードスニペットは、変更の監視を開始するときに、更新イベントの完全なドキュメントを要求する方法を示しています。

```
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().fullDocument(FullDocument.UPDATE_LOOKUP).cursor())
```

# JSON スキーマ検証の使用
<a name="json-schema-validation"></a>

`$jsonSchema` 評価クエリ演算子を使用すると、コレクションに挿入されているドキュメントを検証できます。

**Topics**
+ [JSON スキーマ検証の作成と使用](#get-started-with-validation)
+ [サポートされるキーワード](#json-supported-keywords)
+ [bypassDocumentValidation](#json-schema-bypass)
+ [制限](#json-schema-limitations)

## JSON スキーマ検証の作成と使用
<a name="get-started-with-validation"></a>

### スキーマ検証によるコレクションの作成
<a name="create-collection-with-validation"></a>

`createCollection` 操作ルールと検証ルールを含むコレクションを作成できます。これらの検証ルールは、Amazon DocumentDB ドキュメントの挿入または更新時に適用されます。以下は、従業員のコレクションの検証ルールを説明するコード例です。

```
db.createCollection("employees", {
   "validator": {
      "$jsonSchema": {
         "bsonType": "object",
         "title": "employee validation",
         "required": [ "name", "employeeId"],
         "properties": {
            "name": {
                  "bsonType": "object",
                  "properties": {
                     "firstName": {
                        "bsonType": ["string"]
                     },
                     "lastName": {
                        "bsonType": ["string"]
                     }
                  },
                  "additionalProperties" : false 
            },
            "employeeId": {
               "bsonType": "string",
               "description": "Unique Identifier for employee"
            },
             "salary": {
               "bsonType": "double"
            },
            "age": {
               "bsonType": "number"
            }
         },
         "additionalProperties" : true 
      }
   },
   "validationLevel": "strict", "validationAction": "error"
} )
```

### 有効なドキュメントを挿入します
<a name="insert-valid-document"></a>

次の例では、上記のスキーマ検証ルールに準拠するドキュメントを挿入します。

```
db.employees.insert({"name" : { "firstName" : "Carol" , "lastName" : "Smith"}, "employeeId": "c720a" , "salary": 1000.0 })
db.employees.insert({ "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24})
```

### 無効なドキュメントを挿入します
<a name="insert-invalid-document"></a>

次の例では、上記のスキーマ検証ルールに準拠していないドキュメントを挿入します。この例では、employeeId の値は文字列ではありません。

```
db.employees.insert({
    "name" : { "firstName" : "Carol" , "lastName" : "Smith"}, 
    "employeeId": 720 , 
    "salary": 1000.0 
})
```

この例は、文書内の構文が正しくないことを示しています。

### コレクションを変更する
<a name="modify-collection"></a>

`collMod` コマンドは、既存のコレクションの検証ルールを追加または変更するために使用されます。次の例では、給与フィールドを必須フィールドリストに追加しています。

```
db.runCommand({"collMod" : "employees", 
   "validator": {
      "$jsonSchema": {
         "bsonType": "object",
         "title": "employee validation",
         "required": [ "name", "employeeId", "salary"],
         "properties": {
            "name": {
                  "bsonType": "object",
                  "properties": {
                     "firstName": {
                        "bsonType": ["string"]
                     },
                     "lastName": {
                        "bsonType": ["string"]
                     }
                  },
                  "additionalProperties" : false 
            },
            "employeeId": {
               "bsonType": "string",
               "description": "Unique Identifier for employee"
            },
             "salary": {
               "bsonType": "double"
            },
            "age": {
               "bsonType": "number"
            }
         },
         "additionalProperties" : true 
      }
   }
} )
```

### 検証ルールが変更される前に追加されたドキュメントの対処
<a name="pre-validation-docs"></a>

検証ルールが変更される前にコレクションに追加されたドキュメントの対処には、以下の `validationLevel` 修飾子を使用します。
+ **strict**: すべての挿入と更新に検証ルールを適用します。
+ **moderate**: 既存の有効なドキュメントに検証ルールを適用します。更新中、既存の無効なドキュメントはチェックされません。

次の例では、「employees」という名前のコレクションの検証ルールを更新した後に、給与フィールドが必須になります。次のドキュメントの更新は失敗します。

```
db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }] 
})
```

Amazon DocumentDB は、次の出力を返します。

```
{
"n" : 0,
    "nModified" : 0,
    "writeErrors" : [
        {
"index" : 0,
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

検証レベルを `moderate` に更新すると、上記のドキュメントを正常に更新できるようになります。

```
db.runCommand({
    "collMod" : "employees", 
    validationLevel : "moderate"
})

db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }]
})
```

Amazon DocumentDB は、次の出力を返します。

```
{
"n" : 1,
    "nModified" : 1,
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

### \$1jsonSchema を使用してドキュメントの取得
<a name="json-retrieve-docs"></a>

`$jsonSchema` 演算子は、JSON スキーマに一致するドキュメントをクエリするフィルタとして使用できます。これは最上位の演算子で、フィルタードキュメントに最上位フィールドとして含めることも `$and`、`$or`、`$nor` などのクエリ演算子と一緒に使用することもできます。以下の例は、\$1jsonSchema を個別のフィルターとして、また他のフィルター演算子と併用する方法を示しています。

「employee」コレクションに挿入されたドキュメント:

```
{ "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 }
{ "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 }
{ "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }
{ "name" : { "firstName" : "Jane", "lastName" : "Doe" }, "employeeId" : "c721a", "salary" : 1300 }
```

`$jsonSchema` 演算子のみでフィルタリングされたコレクション:

```
db.employees.find({ 
       $jsonSchema: { required: ["age"] } })
```

Amazon DocumentDB は、次の出力を返します。

```
{ "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 }
{ "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }
```

`$jsonSchema` 演算子と別の演算子でフィルタリングされたコレクション:

```
db.employees.find({ 
       $or: [{ $jsonSchema: { required: ["age", "name"]}}, 
            { salary: { $lte:1000}}]});
```

Amazon DocumentDB は、次の出力を返します。

```
{ "_id" : ObjectId("64e5f8886218c620cf0e8f8a"), "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 }
{ "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 }
{ "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }
```

`$jsonSchema` 演算子でフィルタリングされ、集計フィルタでは `$match` でフィルタリングされたコレクション:

```
db.employees.aggregate(
    [{ $match: { 
        $jsonSchema: { 
            required: ["name", "employeeId"],  
            properties: {"salary" :{"bsonType": "double"}}
        }
       }
    }]
)
```

Amazon DocumentDB は、次の出力を返します。

```
{ 
"_id" : ObjectId("64e5f8886218c620cf0e8f8a"),
 "name" : { "firstName" : "Carol", "lastName" : "Smith" },
"employeeId" : "c720a",
"salary" : 1000 
}
{
"_id" : ObjectId("64e5f91c6218c620cf0e8f8b"),
"name" : { "firstName" : "Emily", "lastName" : "Brown" },
"employeeId" : "c720b",
"age" : 25,
"salary" : 1050.2
}
{
"_id" : ObjectId("64e5f94e6218c620cf0e8f8c"),
"name" : { "firstName" : "William", "lastName" : "Taylor" },
"employeeId" : "c721a",
"age" : 24,
"salary" : 1400.5
}
{
"_id" : ObjectId("64e5f9786218c620cf0e8f8d"),
"name" : { "firstName" : "Jane", "lastName" : "Doe" },
"employeeId" : "c721a",
"salary" : 1300
}
```

### 既存の検証ルールの表示
<a name="view-validation-rules"></a>

コレクションの既存の検証ルールを確認するには、以下を使用してください。

```
db.runCommand({
    listCollections: 1, 
    filter: { name: 'employees' }
})
```

Amazon DocumentDB は、次の出力を返します。

```
{
    "waitedMS" : NumberLong(0),
    "cursor" : {
        "firstBatch" : [
            {
                "name" : "employees",
                "type" : "collection",
                "options" : {
                    "autoIndexId" : true,
                    "capped" : false,
                    "validator" : {
                        "$jsonSchema" : {
                            "bsonType" : "object",
                            "title" : "employee validation",
                            "required" : [
                                "name",
                                "employeeId",
                                "salary"
                            ],
                            "properties" : {
                                "name" : {
                                    "bsonType" : "object",
                                    "properties" : {
                                        "firstName" : {
                                            "bsonType" : [
                                                "string"
                                            ]
                                        },
                                        "lastName" : {
                                            "bsonType" : [
                                                "string"
                                            ]
                                        }
                                    },
                                    "additionalProperties" : false
                                },
                                "employeeId" : {
                                    "bsonType" : "string",
                                    "description" : "Unique Identifier for employee"
                                },
                                "salary" : {
                                    "bsonType" : "double"
                                },
                                "age" : {
                                    "bsonType" : "number"
                                }
                            },
                            "additionalProperties" : true
                        }
                    },
                    "validationLevel" : "moderate",
                    "validationAction" : "error"
                },
                "info" : {
                    "readOnly" : false
                },
                "idIndex" : {
                    "v" : 2,
                    "key" : {
                        "_id" : 1
                    },
                    "name" : "_id_",
                    "ns" : "test.employees"
                }
            }
        ],
        "id" : NumberLong(0),
        "ns" : "test.$cmd.listCollections"
    },
    "ok" : 1,
    "operationTime" : Timestamp(1692788937, 1)
}
```

Amazon DocumentDB は、`$out` 集約ステージでも検証ルールを保持します。

## サポートされるキーワード
<a name="json-supported-keywords"></a>

`create` および `collMod` コマンドでは以下のフィールドがサポートされています。
+ **`Validator`**: `$jsonSchem` オペレーションをサポートしています。
+ **`ValidationLevel`**: `off`、`strict`、`moderate` の値をサポートします。
+ **`ValidationAction`**: `error` の値をサポートします。

\$1jsonSchema 演算子は以下のキーワードをサポートします。
+ `additionalItems`
+ `additionalProperties`
+ `allOf`
+ `anyOf`
+ `bsonType`
+ `dependencies`
+ `description`
+ `enum`
+ `exclusiveMaximum`
+ `exclusiveMinimum`
+ `items`
+ `maximum`
+ `minimum`
+ `maxItems`
+ `minItems`
+ `maxLength`
+ `minLength`
+ `maxProperties`
+ `minProperties`
+ `multipleOf`
+ `not`
+ `oneOf`
+ `pattern`
+ `patternProperties`
+ `properties`
+ `required`
+ `title`
+ `type`
+ `uniqueItems`

## bypassDocumentValidation
<a name="json-schema-bypass"></a>

Amazon DocumentDB は、次のコマンドとメソッドについて `bypassDocumentValidation` をサポートしています。
+ `insert`
+ `update`
+ `findAndModify`
+ `aggregate` コマンドおよび `db.collection.aggregate()` メソッドにおける `$out` ステージ

Amazon DocumentDB は、次のコマンドについては `bypassDocumentValidation` をサポートしていません。
+ `aggregate` コマンドおよび `db.collection.aggregate()` メソッドにおける `$merge`
+ `mapReduce` コマンドおよび `db.collection.mapReduce()` メソッド
+ `applyOps` コマンド

## 制限
<a name="json-schema-limitations"></a>

`$jsonSchema` の検証には以下の制限が適用されます。
+ Amazon DocumentDB は、オペレーションが検証ルールに失敗すると、「ドキュメントの検証に失敗しました」というエラーを返します。
+ Amazon DocumentDB Elastic クラスターは、`$jsonSchema` をサポートしていません。　