

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Desenvolver com o Amazon DocumentDB
<a name="documentdb-development"></a>

Essas seções abrangem o desenvolvimento com o uso do Amazon DocumentDB.

**Topics**
+ [Conecte-se ao DocumentDB](connect-docdb.md)
+ [Programação com o DocumentDB](program-docdb.md)

# Conecte-se ao Amazon DocumentDB
<a name="connect-docdb"></a>

O Amazon DocumentDB fornece várias opções de conexão, incluindo conexões programáticas usando drivers de MongoDB, conexão de fora de uma VPC por meio de tunelamento SSH ou AWS VPN e ferramentas populares como Studio 3T e DataGrip. O serviço oferece suporte a conexões de conjuntos de réplicas para alta disponibilidade. Para análises e relatórios, é possível se conectar usando drivers de JDBC ou ODBC. Instâncias do EC2 na mesma VPC podem se conectar diretamente aos clusters do DocumentDB. Todas as conexões exigem TLS e credenciais/autenticação da AWS adequadas.

**Topics**
+ [Conexão programática](connect_programmatically.md)
+ [Conectar-se de fora de uma Amazon VPC](connect-from-outside-a-vpc.md)
+ [Conectar-se como um conjunto de réplicas](connect-to-replica-set.md)
+ [Conectar usando o Studio 3T](studio3t.md)
+ [Conectar-se usando o DataGrip](data-grip-connect.md)
+ [Conecte usando o Amazon EC2](connect-ec2.md)
+ [Conecte-se usando o driver JDBC](connect-jdbc.md)
+ [Conecte-se usando o driver ODBC](connect-odbc.md)

# Conectar-se de forma programática ao Amazon DocumentDB
<a name="connect_programmatically"></a>

Esta seção contém exemplos de código que demonstram como se conectar ao Amazon DocumentDB (compativel com MongoDB) usando diversas linguagens diferentes. Os exemplos são separados em duas seções com base na conexão com um cluster que tenha o Transport Layer Security (TLS) ativado ou desativado. Por padrão, o TLS fica ativado em clusters do Amazon DocumentDB. No entanto, se quiser, é possível desativar o TLS. Para obter mais informações, consulte [Criptografia de dados em trânsito](security.encryption.ssl.md). 

Se você estiver tentando se conectar ao seu Amazon DocumentDB de fora da VPC em que seu cluster reside, consulte [Conectar-se a um cluster do Amazon DocumentDB de fora de uma Amazon VPC](connect-from-outside-a-vpc.md). 

Antes de se conectar ao cluster, é necessário saber se o TLS está ativado no cluster. A próxima seção mostra como determinar o valor do parâmetro `tls` do seu cluster usando o Console de gerenciamento da AWS ou a AWS CLI. Depois disso, é possível continuar localizando e aplicando o exemplo de código apropriado.

**Topics**
+ [

## Determinar o valor do parâmetro `tls`
](#connect_programmatically-determine_tls_value)
+ [

## Conectar-se com o TLS habilitado
](#connect_programmatically-tls_enabled)
+ [

## Conectar-se com o TLS desabilitado
](#connect_programmatically-tls_disabled)

## Determinar o valor do parâmetro `tls`
<a name="connect_programmatically-determine_tls_value"></a>

Determinar se o seu cluster tem o TLS ativado é um processo de duas etapas que é possível executar usando o Console de gerenciamento da AWS ou a AWS CLI.

1. **Descubra qual grupo de parâmetros está regendo de seu cluster.**

------
#### [ Using the Console de gerenciamento da AWS ]

   1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon DocumentDB em [https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb).

   1. No painel de navegação à esquerda, escolha **Clusters**.

   1. Na lista de clusters, selecione o nome do cluster.

   1. A página resultante exibe os detalhes do cluster selecionado. Selecione a guia **Configuration** (Configuração). Na seção **Configurações e status**, localize o nome do grupo de parâmetros abaixo do **grupo de parâmetros do cluster**.

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

   O código de AWS CLI a seguir determina qual parâmetro está regendo o cluster. Não se esqueça de substituir *`sample-cluster`* pelo nome do cluster.

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

   A saída dessa operação é semelhante à seguinte:

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

------

1. **Descubra o valor do parâmetro `tls` no grupo de parâmetros de seu cluster.**

------
#### [ Using the Console de gerenciamento da AWS ]

   1. No painel de navegação, escolha **Grupos de parâmetros**.

   1. Na janela **Grupos de parâmetros do cluster**, selecione o nome do seu grupo de parâmetros do cluster da Etapa 1d.

   1. A página resultante mostra os parâmetros do grupo de parâmetros do cluster. É possível ver o valor do parâmetro `tls` aqui. Para obter informações sobre como modificar esse parâmetro, consulte [Modificando grupos de parâmetros de cluster do Amazon DocumentDB](cluster_parameter_groups-modify.md).

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

   É possível usar o comando da `describe-db-cluster-parameters` AWS CLI para exibir os detalhes dos parâmetros no grupo de parâmetros do cluster.
   + **`--describe-db-cluster-parameters`** — para listar todos os parâmetros em um grupo de parâmetros e seus valores.
     + **`--db-cluster-parameter-group name`** — obrigatório. O nome do grupo de parâmetros de cluster.

   Nos exemplos a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

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

   A saída dessa operação é semelhante à seguinte: 

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

**nota**  
O Amazon DocumentDB oferece suporte a endpoints FIPS 140-3 a partir dos clusters do Amazon DocumentDB 5.0 (versão do mecanismo 3.0.3727) nas seguintes regiões: ca-central-1, us-west-2, us-east-1, us-east-2, us -gov-east-1, us-gov-west-1.

------

Depois de descobrir o valor do parâmetro `tls`, continue a conexão ao cluster usando um dos exemplos de código nas seções a seguir.
+ [Conectar-se com o TLS habilitado](#connect_programmatically-tls_enabled) 
+ [Conectar-se com o TLS desabilitado](#connect_programmatically-tls_disabled) 

## Conectar-se com o TLS habilitado
<a name="connect_programmatically-tls_enabled"></a>

Para ver um exemplo de código para se conectar de forma programática a um cluster do Amazon DocumentDB com o TLS ativado, escolha a guia apropriada para a linguagem que você deseja usar.

Para criptografar dados em trânsito, faça o download da chave pública para Amazon DocumentDB nomeada `global-bundle.pem` usando a operação a seguir.

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

Se sua aplicação estiver no Microsoft Windows e exigir um arquivo PKCS7, é possível fazer o download de certificados PKCS7. Esse pacote contém os certificados intermediário e raiz em [https://truststore.pki.rds.amazonaws.com/global/global-bundle.p7b](https://truststore.pki.rds.amazonaws.com/global/global-bundle.p7b).

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

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Python quando o TLS está ativado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Node.js quando o TLS está ativado.

**Importante**  
Há uma limitação conhecida com os drivers de NodeJS de versão anterior a 6.13.1, que atualmente não têm mais suporte para autenticação de identidades do IAM para o Amazon DocumentDB. Os drivers e ferramentas do Node.js que usam o driver Node.js (por exemplo, mongosh) devem ser atualizados para usar a versão 6.13.1 ou mais recente do driver de Node.js.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando PHP quando o TLS está ativado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
<?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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Go quando o TLS está ativado.

**nota**  
Desde a versão 1.2.1, o MongoDB Go Driver usará apenas o primeiro certificado de servidor CA encontrado em `sslcertificateauthorityfile`. O código de exemplo abaixo aborda essa limitação anexando manualmente todos os certificados de servidor encontrados em `sslcertificateauthorityfile` a uma configuração TLS personalizada usada durante a criação do cliente. 

Nos exemplos a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

Ao se conectar a um cluster do Amazon DocumentDB com o TLS habilitado em uma aplicação Java, o programa deve usar o arquivo da autoridade de certificação fornecido pela AWS para validar a conexão. Para usar o certificado da Amazon RDS CA, faça o seguinte:

1. Faça o download do arquivo da Amazon RDS CA do [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) .

1. Crie um armazenamento confiável com o certificado da CA contido no arquivo executando os seguintes comandos. Certifique-se de alterar *truststore-password* para algo diferente. Se estiver acessando um armazenamento confiável que contenha o certificado da CA antigo (`rds-ca-2015-root.pem`) e o novo (`rds-ca-2019-root.pem`), é possível importar o pacote de certificados para o armazenamento confiável. 

   Veja a seguir um exemplo de script shell que importa o pacote de certificados para um armazenamento confiável em um sistema operacional Linux. Nos exemplos a seguir, substitua cada *espaço reservado ao usuário* por suas próprias informações. Mais notavelmente, sempre que o diretório de exemplo "*mydir*" estiver localizado no script, substitua-o por um diretório que você criou para essa tarefa.

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

   Veja a seguir um exemplo de script do shell que importa o pacote de certificados em um armazenamento de confiança no 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. Use o `keystore` no seu programa definindo as seguintes propriedades do sistema na aplicação antes de estabelecer uma conexão com o cluster do Amazon DocumentDB.

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

1. O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Java quando o TLS está ativado.

   No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

   ```
   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 ]

O código a seguir demonstra como conectar-se ao Amazon DocumentDB usando C\$1 / .NET quando o TLS está habilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar e consultar o Amazon DocumentDB usando a versão mais recente, mongosh, ou a versão anterior do shell do mongo, quando o TLS está habilitado.

**Conecte-se ao Amazon DocumentDB com o mongosh**.

**Importante**  
Há uma limitação conhecida com os drivers de NodeJS de versão anterior a 6.13.1, que atualmente não têm mais suporte para autenticação de identidades do IAM para o Amazon DocumentDB. Os drivers e ferramentas do Node.js que usam o driver Node.js (por exemplo, mongosh) devem ser atualizados para usar a versão 6.13.1 ou mais recente do driver de Node.js.

Nos exemplos a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

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

**Conecte-se ao Amazon DocumentDB com a versão anterior do shell do mongo**

Se você usa o IAM, deve usar uma versão anterior do shell mongo. Insira uma das opções de comando a seguir:

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

Se você estiver usando uma versão igual ou superior a 4.2, use o código a seguir para conectar. Não há suporte para gravações com novas tentativas no Amazon DocumentDB. Se você estiver usando o shell mongo (não mongosh), não inclua o comando `retryWrites=false` em nenhuma string de código. Por padrão, as gravações que podem ser repetidas estão desabilitadas. A inclusão de `retryWrites=false` pode causar falha nos comandos de leitura normais.

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

**Teste a conexão**

1. Insira um único documento.

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

1. Encontre o documento inserido anteriormente.

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

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

O código a seguir demonstra como se conectar ao Amazon DocumentDB com R usando o mongolite ([https://jeroen.github.io/mongolite/](https://jeroen.github.io/mongolite/)) quando o TLS está habilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
#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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB com o Ruby quando o TLS está habilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

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

------

## Conectar-se com o TLS desabilitado
<a name="connect_programmatically-tls_disabled"></a>

Para ver um exemplo de código para se conectar de forma programática a um cluster do Amazon DocumentDB com o TLS desativado, escolha a guia para a linguagem que você deseja usar.

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

O código a seguir demonstra como conectar-se ao Amazon DocumentDB usando Python quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
## 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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Node.js quando o TLS está desabilitado.

**Importante**  
Há uma limitação conhecida com os drivers de NodeJS de versão anterior a 6.13.1, que atualmente não têm mais suporte para autenticação de identidades do IAM para o Amazon DocumentDB. Os drivers e ferramentas do Node.js que usam o driver Node.js (por exemplo, mongosh) devem ser atualizados para usar a versão 6.13.1 ou mais recente do driver de Node.js.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando PHP quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
<?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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Go quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando Java quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB usando C\$1/.NET quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
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 ]

O código a seguir demonstra como se conectar e consultar o Amazon DocumentDB usando a versão mais recente, mongosh, ou a versão anterior do shell do mongo, quando o TLS está desabilitado.

**Conecte-se ao Amazon DocumentDB com o mongosh**.

**Importante**  
Há uma limitação conhecida com os drivers de NodeJS de versão anterior a 6.13.1, que atualmente não têm mais suporte para autenticação de identidades do IAM para o Amazon DocumentDB. Os drivers e ferramentas do Node.js que usam o driver Node.js (por exemplo, mongosh) devem ser atualizados para usar a versão 6.13.1 ou mais recente do driver de Node.js.

Nos exemplos a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

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

**Conecte-se ao Amazon DocumentDB com a versão anterior do shell do mongo**

Se você usa o IAM, deve usar uma versão anterior do shell mongo. Insira uma das opções de comando a seguir:

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

Se você estiver usando uma versão igual ou superior a 4.2, use o código a seguir para conectar. Não há suporte para gravações com novas tentativas no Amazon DocumentDB. Se você estiver usando o shell mongo (não mongosh), não inclua o comando `retryWrites=false` em nenhuma string de código. Por padrão, as gravações que podem ser repetidas estão desabilitadas. A inclusão de `retryWrites=false` pode causar falha nos comandos de leitura normais.

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

**Teste a conexão**

1. Insira um único documento.

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

1. Encontre o documento inserido anteriormente.

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

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

O código a seguir demonstra como se conectar ao Amazon DocumentDB com R usando o mongolite ([https://jeroen.github.io/mongolite/](https://jeroen.github.io/mongolite/)) quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

```
#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 ]

O código a seguir demonstra como se conectar ao Amazon DocumentDB com o Ruby quando o TLS está desabilitado.

No exemplo a seguir, substitua cada *espaço reservado ao usuário* pelas informações do seu cluster.

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

------

# Conectar-se a um cluster do Amazon DocumentDB de fora de uma Amazon VPC
<a name="connect-from-outside-a-vpc"></a>

Os clusters do Amazon DocumentDB (compatível com MongoDB) são implantados dentro de uma Amazon Virtual Private Cloud (Amazon VPC). Eles podem ser acessados diretamente por instâncias do Amazon EC2 ou outros serviços AWS que são implantados no mesmo Amazon VPC. Além disso, o Amazon DocumentDB pode ser acessado por instâncias do EC2 ou outros serviços AWS em VPCs diferentes na mesma Região da AWS ou em outras regiões da por meio do emparelhamento de VPC.

No entanto, suponha que seu caso de uso exija que você (ou sua aplicação) acesse seus recursos do Amazon DocumentDB de fora da VPC do cluster. Nesse caso, é possível usar o tunelamento SSH (também conhecido como *encaminhamento de porta*) para acessar seus recursos do Amazon DocumentDB. 

Não faz parte da finalidade deste tópico abordar detalhadamente o tunelamento SSH. Para obter mais informações sobre o tunelamento SSH, consulte o seguinte:
+ [Túnel de SSH](https://www.ssh.com/ssh/tunneling/) 
+ [Exemplo de encaminhamento de porta SSH](https://www.ssh.com/ssh/tunneling/example), especificamente a seção [Encaminhamento local](https://www.ssh.com/ssh/tunneling/example#sec-Local-Forwarding)

Para criar um túnel SSH, você precisa de uma instância do Amazon EC2 em execução na mesma Amazon VPC que seu cluster do Amazon DocumentDB. É possível usar uma instância do EC2 existente na mesma VPC que seu cluster ou criar uma instância. Para obter mais informações, consulte o tópico apropriado para seu sistema operacional:
+ [ Como iniciar com instâncias do Linux do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)
+ [ Como iniciar com instâncias do Windows do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html)

Normalmente, é possível se conectar a uma instância do EC2 com o seguinte comando.

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

Se esse for o caso, será possível configurar um túnel SSH para o cluster do Amazon DocumentDB `sample-cluster.node.us-east-1.docdb.amazonaws.com` executando o comando a seguir no seu computador local. O sinalizador `-L` é usado para encaminhar uma porta local. Ao usar um túnel SSH, recomendamos que você se conecte ao cluster usando o endpoint do cluster e não tente se conectar no modo de conjunto de réplicas (ou seja, especificando `replicaSet=rs0` em sua string de conexão), pois isso resultará em um erro.

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

Depois que o túnel SSH for criado, todos os comandos que você emitir para `localhost:27017` serão encaminhados para o cluster do Amazon DocumentDB `sample-cluster` em execução na Amazon VPC. Se o Transport Layer Security (TLS) estiver ativado no cluster do Amazon DocumentDB, será necessário fazer o download da chave pública para o Amazon DocumentDB em [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) . A operação a seguir faz download deste arquivo:

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

**nota**  
O TLS está habilitado por padrão para todos os novos clusters do Amazon DocumentDB. No entanto, você poderá desabilitá-lo. Para obter mais informações, consulte [Gerenciar configurações de TLS de cluster do Amazon DocumentDB](security.encryption.ssl.md#security.encryption.ssl.managing). 

Para conectar-se ao seu cluster do Amazon DocumentDB de fora do Amazon VPC, use o comando a seguir.

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

# Conectar-se ao Amazon DocumentDB como um conjunto de réplicas
<a name="connect-to-replica-set"></a>

Ao desenvolver no Amazon DocumentDB (compatível com MongoDB), recomendamos que você se conecte ao cluster como um conjunto de réplicas e distribua leituras para instâncias de réplica usando os recursos integrados de preferência de leitura do seu driver. Esta seção detalha o que isso significa e descreve como é possível se conectar ao seu cluster do Amazon DocumentDB como um conjunto de réplicas usando o SDK for Python como exemplo.

O Amazon DocumentDB tem três endpoints que podem ser usados para se conectar ao cluster:
+ Endpoint do cluster
+ Endpoint de leitor
+ Endpoints da instância

Na maioria dos casos, quando você se conecta ao Amazon DocumentDB, recomendamos o uso do endpoint do cluster. Isso é um CNAME que aponta para a instância principal no cluster, conforme mostrado no diagrama a seguir.

Ao usar um túnel SSH, recomendamos que você se conecte ao cluster usando o endpoint do cluster e não tente se conectar no modo de conjunto de réplicas (ou seja, especificando `replicaSet=rs0` em sua string de conexão), pois isso resultará em um erro.

**nota**  
Para obter mais informações sobre endpoints do Amazon DocumentDB, consulte [Endpoints do Amazon DocumentDB](how-it-works.md#how-it-works.endpoints).

![\[Diagrama mostrando endpoints do Amazon DocumentDB, incluindo os endpoints do cluster, de leitor e da instância.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/docdb-endpoint-types.png)


Ao usar o endpoint do cluster, é possível se conectar ao cluster no modo de conjunto de réplicas. Depois, você poderá usar os recursos integrados do driver de preferência de leitura. No exemplo a seguir, especificar `/?replicaSet=rs0` significa para o SDK que você deseja se conectar como um conjunto de réplicas. Se você omitir `/?replicaSet=rs0'`, o cliente roteará todas as solicitações para o endpoint do cluster, ou seja, sua instância principal.

```
## 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')
```

A vantagem de se conectar como um conjunto de réplicas é que isso permite que o SDK descubra a topografia do cluster automaticamente, incluindo quando as instâncias são adicionadas ou removidas do cluster. Você poderá usar seu cluster de forma mais eficiente roteando solicitações de leitura para suas instâncias de réplica.

Ao se conectar como um conjunto de réplicas, é possível especificar a `readPreference` para a conexão. Se você especificar uma preferência de leitura de `secondaryPreferred`, o cliente roteará as consultas de leitura para suas réplicas e as consultas de gravação para sua instância principal (como no diagrama a seguir). Esse é um uso melhor dos recursos do cluster. Para obter mais informações, consulte [Opções de preferência de leitura](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')
```

![\[Diagrama mostrando o readPreference do Amazon DocumentDB: secondaryPreferred.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/docdb-readPreference-secondaryPreferred.png)


As leituras de réplicas do Amazon DocumentDB são eventualmente consistentes. Elas retornam os dados na mesma ordem em que foram gravados na instância principal, e geralmente há menos de 50 ms de tempo de atraso de replicação. É possível monitorar o tempo de atraso da réplica do cluster usando as métricas Amazon CloudWatch `DBInstanceReplicaLag` e `DBClusterReplicaLagMaximum`. Para obter mais informações, consulte [Monitorando o Amazon DocumentDB com CloudWatch](cloud_watch.md).

Diferentemente da arquitetura de banco de dados monolítica tradicional, o Amazon DocumentDB separa o armazenamento e a computação. Considerando essa arquitetura moderna, recomendamos que você faça a escalabilidade de leitura nas instâncias de réplica. As leituras nas instâncias de réplica não bloqueiam as gravações que são replicadas a partir da instância principal. É possível adicionar até 15 instâncias de réplica de leitura em um cluster e expandir para milhões de leituras por segundo.

O principal benefício de se conectar como um conjunto de réplicas e distribuir leituras para réplicas é que ele aumenta os recursos gerais em seu cluster que estão disponíveis para trabalhar em sua aplicação. Como uma melhor prática, recomendamos conectar-se como um conjunto de réplicas. Além disso, recomendamos que isso seja feito mais comumente nos seguintes cenários:
+ Você está usando quase 100% de CPU na principal.
+ A proporção de acertos do cache em buffer é próxima de zero.
+ Você atinge os limites de conexão ou de cursor para uma instância individual.

Expandir o tamanho de uma instância de cluster é uma opção e, em alguns casos, essa pode ser a melhor maneira de escalar o cluster. Mas você também deve considerar como usar melhor as réplicas que já tem em seu cluster. Isso permite aumentar a escala sem o aumento do custo de usar um tipo de instância maior. Recomendamos também que você monitore e alerte sobre esses limites (ou seja `CPUUtilization`, `DatabaseConnections`, e `BufferCacheHitRatio`) usando alarmes do CloudWatch para que saiba quando um recurso está sendo usado intensamente. 

Para obter mais informações, consulte os tópicos a seguir.
+ [Práticas recomendadas do Amazon DocumentDB](best_practices.md)
+ [Cotas e limites do Amazon DocumentDB](limits.md)

## Usar conexões de cluster
<a name="connect-to-replica-set.utilizing-cluster-connections"></a>

Considere o cenário de uso de todas as conexões em seu cluster. Por exemplo, uma instância `r5.2xlarge` tem um limite de 4.500 conexões (e 450 cursores abertos). Se você criar um cluster do Amazon DocumentDB de três instâncias e se conectar somente à instância principal usando o endpoint do cluster, os limites do cluster para conexões abertas e cursores serão 4.500 e 450, respectivamente. Talvez você atinja esses limites se estiver criando aplicações que usem muitos operadores que sejam configurados em contêineres. Os contêineres abrem várias conexões de uma só vez e saturam o cluster.

Em vez disso, é possível se conectar ao cluster do Amazon DocumentDB como um conjunto de réplicas e distribuir suas leituras para as instâncias de réplica. Depois, é possível efetivamente triplicar o número de conexões e cursores disponíveis no cluster para 13.500 e 1.350, respectivamente. Adicionar mais instâncias ao cluster só aumentará o número de conexões e cursores para workloads de leitura. Se for necessário aumentar o número de conexões para gravações em seu cluster, recomendamos aumentar o tamanho da instância.

**nota**  
O número de conexões para instâncias `large`, `xlarge` e `2xlarge` aumenta com o tamanho da instância, chegando até 4.500. O número máximo de conexões por instância para instâncias `4xlarge` ou maiores é 4.500. Para obter mais informações sobre limites por tipos de instância, consulte [Limites de instâncias](limits.md#limits.instance).

Normalmente, não recomendamos que você se conecte ao cluster usando a preferência de leitura de `secondary`. Isso ocorre porque, se não houver instâncias de réplica no cluster, haverá falha nas leituras. Por exemplo, suponha que você tenha um cluster do Amazon DocumentDB de duas instâncias com uma principal e uma de réplica. Se a instância de réplica tiver um problema, haverá falha nas solicitações de leitura de um grupo de conexão que esteja definido como `secondary`. A vantagem de `secondaryPreferred` é que, se o cliente não conseguir encontrar uma instância de réplica adequada à qual se conectar, ele voltará para a principal para leituras.

## Vários grupos de conexões
<a name="connect-to-replica-set.multiple-connection-pools"></a>

Em alguns cenários, as leituras em uma aplicação devem ter consistência de leitura após gravação, que pode ser atendida somente a partir da instância principal no Amazon DocumentDB. Nesses cenários, você pode criar dois grupos de conexão de cliente: um para gravações e outro para leituras que precisam de consistência de leitura após gravação. Para fazer isso, seu código deve ser semelhante ao seguinte:

```
## 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')
```

Outra opção é criar um único grupo de conexões e substituir a preferência de leitura para uma determinada coleção.

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

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

Para usar melhor os recursos em seu cluster, recomendamos que você se conecte ao cluster usando o modo de conjunto de réplicas. Se for adequado para sua aplicação, você poderá fazer a escalabilidade de leitura de sua aplicação distribuindo suas leituras para as instâncias de réplica.

# Conectar a um cluster Amazon DocumentDB a partir do Studio 3T
<a name="studio3t"></a>

O [Studio 3T](https://studio3t.com/) é uma GUI e IDE popular para desenvolvedores e engenheiros de dados que trabalham com o MongoDB. Ele oferece vários recursos poderosos: visualizações em árvore, tabela e JSON de seus dados, fáceis import/export em CSV, JSON, SQL e BSON/MongoDump, opção de consulta flexível, uma drag-and-drop interface visual, um shell mongo integrado com preenchimento automático, um editor de pipeline de agregação e suporte a consultas SQL.

## Pré-requisitos
<a name="prerequisites"></a>
+ Se você ainda não tem um cluster Amazon DocumentDB usando o Amazon EC2 como bastion/jump host, siga as instruções sobre como [se conectar ao Amazon](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html) EC2.
+ Se você não tem o Studio 3T, [faça o download e instale](https://studio3t.com/download). 

## Conectar com o Studio 3T
<a name="connect-studio3t"></a>

1. Escolha **Conectar** no canto superior esquerdo da barra de ferramentas.  
![\[Interface do Studio 3T mostrando a tela de boas-vindas e a opção Conectar-se destacada no canto superior esquerdo.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-connect.png)

1. Escolha **Nova conexão** no canto superior esquerdo da barra de ferramentas.  
![\[Interface do Gerenciador de conexões com a opção Nova conexão destacada no canto superior esquerdo.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-newconn.png)

1. Na guia **Servidor**, no campo **Servidor**, digite as informações do endpoint do cluster.  
![\[Guia Servidor na interface Nova conexão com o campo de entrada Servidor destacado.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-endpoint.png)
**nota**  
Não consegue encontrar seu endpoint de cluster? Basta seguir as etapas [aqui](https://docs.aws.amazon.com/documentdb/latest/developerguide/db-instance-endpoint-find.html).

1. Escolha a guia **Autenticação** e selecione **Legado** no menu suspenso do **Modo de Autenticação**.  
![\[Guia Autenticação na interface Nova conexão com o modo de autenticação legado selecionado e informações de nome de usuário, senha e banco de dados de autenticação fornecidas.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-auth.png)

1. Insira seu nome de usuário e credenciais nos campos **Nome de usuário** e **Senha**.

1. Escolha a guia **SSL** e marque a caixa **Usar protocolo SSL para conectar**.  
![\[Guia SSL na interface Nova conexão com a opção Usar protocolo SSL para se conectar selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-ssl.png)

1. Escolha **Usar arquivo CA raiz próprio**. Em seguida, adicione o certificado Amazon DocumentDB (você pode pular essa etapa se o SSL estiver desabilitado no seu cluster do DocumentDB). Marque a caixa para permitir **nomes de host inválidos**.  
![\[Guia SSL na interface Nova conexão com o arquivo CA raiz inserido e permitir nomes de host inválidos selecionado.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-ssl.png)
**nota**  
Não tem o certificado? É possível baixar com o seguinte comando:  
 `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem ` 

1. Se estiver se conectando a partir de uma máquina externa à Amazon VPC, você precisará criar um túnel SSH. Você fará isso na guia **SSH**.

   1. Marque a caixa **Usar túnel SSH** e insira o endereço SSH no campo **Endereço SSH.** Esta é a sua instância Public DNS (IPV4). É possível obter essa URL no [Console Amazon EC2 Management](https://console.aws.amazon.com/ec2).

   1. Insira seu nome de usuário. Este é o nome de usuário da instância do Amazon EC2 

   1. Para o **Modo de Autenticação SSH**, selecione **Chave privada**. No campo **Chave privada**, escolha o ícone do localizador de arquivos para localizar e selecionar a chave privada da sua instância do Amazon EC2. Esse é o arquivo .pem (par de chave) que você salvou ao criar sua instância no console do Amazon EC2.

   1. Se você estiver na máquina Linux/macOS cliente, talvez seja necessário alterar as permissões da sua chave privada usando o seguinte comando:

      `chmod 400 /fullPathToYourPemFile/<yourKey>.pem`  
![\[Guia SSH na interface Nova conexão com as credenciais de túnel de SSH inseridas.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-ssh.png)
**nota**  
Essa instância do Amazon EC2 deve estar na mesma Amazon VPC e grupo de segurança que o cluster do DocumentDB. É possível obter o endereço SSH, o nome de usuário e a chave privada no [Console de Gerenciamento do Amazon EC2](https://console.aws.amazon.com/ec2).

1. Agora teste sua configuração escolhendo o botão **Testar conexão**.  
![\[Interface Nova conexão com o botão Testar conexão destacado no canto inferior esquerdo.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-testbutton.png)

1. Uma janela de diagnóstico deve carregar uma barra verde para indicar que o teste foi bem-sucedido. Agora escolha **OK** para fechar a janela de diagnóstico.  
![\[Janela de diagnóstico que aparece após um teste de conexão com êxito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-testconn.png)

1. Escolha **Salavar** para salvar a conexão para uso futuro.  
![\[Interface Nova conexão com o botão Salvar destacado.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-save.png)

1. Agora selecione seu cluster e escolha **Conectar**.  
![\[Interface Gerenciador de conexões com o botão Conextar-se destacado.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/studio3t/studio3t-finalconnect.png)

Parabéns\$1 Agora você está conectado ao seu cluster Amazon DocumentDB por meio do Studio 3T.

# Conectar-se ao Amazon DocumentDB usando o DataGrip
<a name="data-grip-connect"></a>

O [DataGrip](https://www.jetbrains.com/help/datagrip/documentdb.html) é um poderoso ambiente de desenvolvimento integrado (IDE), que oferece suporte a vários sistemas de banco de dados incluindo o Amazon DocumentDB. Esta seção mostra as etapas para você se conectar ao seu cluster do Amazon DocumentDB usando o DataGrip, de maneira a permitir que você gerencie e consulte facilmente seus dados usando uma interface gráfica.

## Pré-requisitos
<a name="data-grip-prerequisites"></a>
+ IDE DataGrip instalado em sua máquina. É possível fazer seu download pelo [JetBrains](https://www.jetbrains.com/datagrip/download/#section=windows).
+ Uma instância do Amazon EC2 em execução na mesma VPC que o seu cluster do Amazon DocumentDB. Você usará essa instância para estabelecer um túnel seguro da sua máquina local para o Amazon DocumentDBCluster. Siga estas instruções para saber como [Conecte usando o Amazon EC2](connect-ec2.md).
+ Alternativa a uma instância do Amazon EC2, uma conexão VPN, ou se já estiver acessando sua infraestrutura AWS usando uma VPN segura. Se você preferir essa opção, siga as instruções para [acessar com segurança o Amazon DocumentDB usando AWS Client VPN](https://aws.amazon.com/blogs/database/securely-access-amazon-documentdb-with-mongodb-compatibility-locally-using-aws-client-vpn/).

## Conectar-se usando o DataGrip
<a name="data-grip-connect-steps"></a>

1. Inicie o DataGrip no seu computador e crie um **Novo projeto**.  
![\[Tela de boas-vindas do DataGrip com a opção Novo projeto destacada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/welcome.png)

1. Adicione uma nova fonte de dados usando uma das seguintes maneiras:

   1. No menu principal, navegue até **Arquivo — Novo — Fonte de dados** e selecione **DocumentDB**

   1. No **Database Explorer**, clique no ícone novo (**\$1**) na barra de ferramentas. Navegue até **Fonte de dados** e selecione **DocumentDB**.  
![\[A lista suspensa para + mostra o submenu Fonte de dados. O DocumentDB é selecionado nesse submenu.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/explorer.png)

1. Na página **Fontes de dados** na guia **Geral**, verifique se há um link para **Fazer o download dos arquivos de driver ausentes** na parte inferior da área de configurações da conexão. Clique neste link para fazer o download dos drivers necessários para interagir com um banco de dados. Para obter um link direto para fazer o download, consulte os [drivers JDBC da JetBrains](https://www.jetbrains.com/datagrip/jdbc-drivers/).  
![\[Interface de fontes de dados e drivers com o link Baixar arquivos de driver ausentes destacado.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/missing-driver.png)

1. Na guia **Geral**, especifique os detalhes da conexão:

   1. No campo **Host**, especifique o endpoint do cluster Amazon DocumentDB.

   1. A **porta** já está definida como 27017. Altere-a se seu cluster foi implantado em uma porta diferente.

   1. Em **Método de autenticação**, escolha **Nome e senha do usuário**.

   1. Insira as informações de nome de usuário e senha.

   1. O campo **Banco de dados** é opcional. É possível especificar o banco de dados ao qual deseja conectar-se.

   1. O campo **URL** é preenchido automaticamente à medida que você adiciona os detalhes acima.  
![\[Campos de host, porta, autenticação, banco de dados e URL na guia Geral na interface Fontes de dados e drivers.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/connection.png)

1. Na guia **SSH/SSL**, habilite **Usar túnel SSH** e então, clique no ícone para abrir a caixa de diálogo **Configuração SSH**. Insira as seguintes informações:

   1. No campo **Host**, insira o nome do host da sua instância do Amazon EC2.

   1. Insira o nome de usuário e senha da sua instância do Amazon EC2.

   1. Em **Tipo de autenticação**, escolha **Par de chave**.

   1. Insira o **arquivo de chave privada**.
**nota**  
Se você estiver usando a opção VPN, não há necessidade de configurar o túnel SSH.  
![\[A guia SSH/SSL na interface Fontes de dados e drivers com a opção Usar túnel SSH selecionada e o ícone de configuração de SSH destacado. O ícone abre a interface Configurações de SSH exibida.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ssh-tunnel.png)

1. Na guia **SSH/SSL**, habilite **Usar SSL**. No campo **Arquivo CA**, insira o local do arquivo `global-bundle.pem` no seu computador. Em **Modo**, deixe a opção **Exigir** como está.
**nota**  
É possível fazer o download do certificado a partir deste local ou com este comando: wget [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem)
**nota**  
Se você estiver tentando conectar-se ao cluster elástico Amazon DocumentDB, não precisará especificar o arquivo CA. Deixe a opção **Usar SSL**, bem como todas as outras opções, marcada em seus valores padrão.  
![\[Guia SSH/SSL na interface Fontes de dados e drivers com as configurações de SSL habilitadas.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/use-ssl.png)

1. Na guia **Esquemas**, escolha **Todos os bancos de dados** ou insira o filtro “\$1: \$1” no campo **Padrão do esquema**. Clique no link **Testar conexão** para testar a conexão.  
![\[A guia Esquemas na interface Fontes de dados e drivers com a opção Todos os bancos de dados selecionada. Uma mensagem de êxito aparece acima do link Testar conexão.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/schemas.png)

1. Depois que a conexão for testada com sucesso, clique em **OK** para salvar a configuração da fonte de dados.

## Atributos do DataGrip
<a name="data-grip-features"></a>

O DataGrip fornece vários atributos para ajudar a trabalhar com o Amazon DocumentDB de forma eficiente:
+ **Editor SQL** — Escreva e execute consultas semelhantes a SQL em suas coleções do DocumentDB usando o editor SQL no DataGrip.
+ **Visual Query Builder** — Use o Visual Query Builder para criar consultas graficamente sem gravar código SQL.
+ **Gerenciamento de esquemas** — Gerencie facilmente seu esquema de banco de dados, inclusive a criação, alteração e eliminação de coleções.
+ **Visualização de dados** — Visualize e analise seus dados usando várias ferramentas de visualização disponíveis no DataGrip.
+ **Exportar e importar dados** — Transfira dados entre o Amazon DocumentDB e outros bancos de dados usando os atributos de exportação e importação do DataGrip.

Consulte a [documentação oficial do DataGrip](https://www.jetbrains.com/datagrip/features/) para obter mais atributos avançados, dicas sobre como trabalhar com o Amazon DocumentDB e outros sistemas de banco de dados.

# Conecte usando o Amazon EC2
<a name="connect-ec2"></a>

Esta seção descreve como configurar a conectividade entre um cluster do Amazon DocumentDB e o Amazon EC2 e acessar o cluster do Amazon DocumentDB a partir da instância do Amazon EC2.

Há duas opções para configurar a conexão do EC2:
+ [Conectar automaticamente a instância do EC2 a um banco de dados do Amazon DocumentDB](connect-ec2-auto.md) — use o recurso de conexão automática no console do EC2 para configurar automaticamente a conexão entre a instância do EC2 e um banco de dados do Amazon DocumentDB novo ou existente. Essa conexão permite que haja tráfego entre a instância do EC2 e o banco de dados do Amazon DocumentDB. Essa opção geralmente é usada para testar e criar novos grupos de segurança.
+ [Conectar manualmente a instância do EC2 ao banco de dados do Amazon DocumentDB](connect-ec2-manual.md) — configure a conexão entre a instância do EC2 e o banco de dados do Amazon DocumentDB configurando e atribuindo manualmente os grupos de segurança para reproduzir a configuração criada pelo recurso de conexão automática. Essa opção geralmente é usada para alterar configurações mais avançadas e usar grupos de segurança existentes.

## Pré-requisitos
<a name="connect-ec2-prerequisites"></a>

Independentemente da opção e antes de criar o primeiro cluster do Amazon DocumentDB, você deve fazer o seguinte:

**Crie uma conta (AWS) da Amazon Web Services**  
Antes de começar a usar o Amazon DocumentDB, você deve ter uma conta da Amazon Web Services (AWS). A AWS conta é gratuita. Você paga apenas pelos serviços e recursos usados.  
Se você não tiver um Conta da AWS, conclua as etapas a seguir para criar um.  

**Para se inscrever em um Conta da AWS**

1. Abra a [https://portal.aws.amazon.com/billing/inscrição.](https://portal.aws.amazon.com/billing/signup)

1. Siga as instruções online.

   Parte do procedimento de inscrição envolve receber uma chamada telefônica ou uma mensagem de texto e inserir um código de verificação pelo teclado do telefone.

   Quando você se inscreve em um Conta da AWS, um *Usuário raiz da conta da AWS*é criado. O usuário-raiz tem acesso a todos os Serviços da AWS e recursos na conta. Como prática recomendada de segurança, atribua o acesso administrativo a um usuário e use somente o usuário-raiz para executar [tarefas que exigem acesso de usuário-raiz](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks).

**Opcionalmente, configure as permissões necessárias AWS Identity and Access Management (IAM).**  
O acesso para gerenciar recursos do Amazon DocumentDB, como clusters, instâncias e grupos de parâmetros de cluster, requer credenciais que AWS possam ser usadas para autenticar suas solicitações. Para obter mais informações, consulte [Gerenciamento de identidade e Gerenciamento de acesso para o Amazon DocumentDB](security-iam.md).   

1. Na barra de pesquisa do Console de gerenciamento da AWS, digite IAM e selecione **IAM** no menu suspenso exibido.

1. Depois de chegar ao console do IAM, selecione **Usuários** no painel de navegação.

1. Selecione o nome de usuário.

1. Clique no botão **Adicionar permissões**.

1. Selecione **Attach existing policies directly (Anexar políticas existentes diretamente)**.

1. Digite `AmazonDocDBFullAccess` na barra de pesquisa e selecione-a quando ela aparecer nos resultados da pesquisa.

1. Clique no botão azul na parte inferior que diz **Avançar: Revisão**.

1. Clique no botão azul na parte inferior que diz **Adicionar permissões**.

**Como criar uma Amazon Virtual Private Cloud (Amazon VPC)**  
Dependendo de onde Região da AWS você estiver, você pode ou não ter uma VPC padrão já criada. Se você não tiver uma VPC padrão, conclua a etapa 1 de [Conceitos básicos da Amazon VPC no Guia do usuário da Amazon *VPC*](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html). Isso levará menos de cinco minutos.

# Conectar o Amazon EC2 automaticamente
<a name="connect-ec2-auto"></a>

**Topics**
+ [

## Conectar automaticamente uma instância do EC2 a um novo banco de dados do Amazon DocumentDB
](#auto-connect-ec2.process)
+ [

## Conectar automaticamente uma instância do EC2 a um banco de dados do Amazon DocumentDB existente
](#auto-connect-ec2-existing-cluster)
+ [

## Visão geral da conectividade automática com uma instância do EC2
](#auto-connect-ec2.overview)
+ [

## Visualizar recursos computacionais conectados
](#auto-connect-ec2.compute)

Antes de configurar uma conexão entre uma instância do EC2 e um novo banco de dados do Amazon DocumentDB, verifique se você atende aos requisitos descritos em [Visão geral da conectividade automática com uma instância do EC2](#auto-connect-ec2.overview). Se você alterar esses grupos de segurança depois de configurar a conectividade, as alterações poderão afetar a conexão entre a instância do EC2 e o banco de dados do Amazon DocumentDB. 

**nota**  
Você só pode configurar automaticamente uma conexão entre uma instância do EC2 e um banco de dados do Amazon DocumentDB utilizando o Console de gerenciamento da AWS. Você não pode configurar uma conexão automaticamente com a API AWS CLI ou com a Amazon DocumentDB.

## Conectar automaticamente uma instância do EC2 a um novo banco de dados do Amazon DocumentDB
<a name="auto-connect-ec2.process"></a>

O processo a seguir pressupõe que você concluiu as etapas do tópico [Pré-requisitos](connect-ec2.md#connect-ec2-prerequisites).

**Topics**
+ [

### Etapa 1: criar uma instância do Amazon EC2
](#auto-connect-ec2.launch-ec2-instance)
+ [

### Etapa 2: criar um cluster do Amazon DocumentDB
](#auto-connect-ec2.launch-cluster)
+ [

### Etapa 3: conectar-se à instância do Amazon EC2
](#manual-connect-ec2.connect)
+ [

### Etapa 4: instalação do shell do MongoDB
](#auto-connect-ec2.install-mongo-shell)
+ [

### Etapa 5: gerenciar o Amazon DocumentDB TLS
](#auto-connect-ec2.tls)
+ [

### Etapa 6: conectar-se ao cluster do Amazon DocumentDB
](#auto-connect-ec2.connect-use)
+ [

### Etapa 7: inserir e consultar dados
](#auto-cloud9-insert-query)
+ [

### Etapa 8: explorar
](#auto-connect-ec2.explore)

### Etapa 1: criar uma instância do Amazon EC2
<a name="auto-connect-ec2.launch-ec2-instance"></a>

Nesta etapa, você criará uma instância do Amazon EC2 na mesma região e na Amazon VPC que você usará posteriormente para provisionar seu cluster Amazon DocumentDB. 

1. No console do Amazon EC2, selecione **Iniciar instância**.  
![\[A seção Iniciar instância no console do Amazon EC2\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/launch-instance.png)

1. Insira um nome ou identificador no campo **Nome**, localizado na seção **Nome e tags**.

1. Na lista suspensa **Imagem de máquina da Amazon (AMI)**, localize a **AMI do Amazon Linux 2** e escolha-a.  
![\[A interface de imagens da aplicação e do sistema operacional com a opção Amazon Linux 2 AMI selecionada na seção Início rápido.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/linux2-ami.png)

1. Localize e escolha **t3.micro** na lista suspensa **Tipo de instância**.

1. Na seção **Par de chaves (login)** insira o identificador de um par de chaves existente ou selecione **Criar um novo par de chaves**.  
![\[A interface do par de chaves mostrando o campo de nome do par de chaves e a opção Criar novo par de chaves.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/key-pair.png)

   É necessário fornecer um par de chaves do Amazon EC2.
   + Se você tiver um par de chaves do Amazon EC2:

     1. Selecione um par de chaves, escolha seu par de chaves na lista.

     1. Você já deve ter o arquivo de chave privada (arquivo .pem ou .ppk) disponível para fazer login na instância do Amazon EC2.
   + Se você não tiver um par de chaves do Amazon EC2:

     1. Ao escolher **Criar novo par de chaves**, a caixa de diálogo **Criar par de chaves** é exibida.

     1. Insira um nome no campo **Nome do par de chaves**.

     1. Escolha o **Tipo de par de chaves** e o **Formato de arquivo de chave privada**. 

     1. Escolha **Create key pair (Criar par de chaves)**.  
![\[A interface Criar par de chaves com campos para nome, tipo e formato de arquivo do par de chaves. O botão Criar par de chaves está localizado no canto inferior direito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/create-key-pair.png)
**nota**  
Para fins de segurança, é altamente recomendável usar um par de chaves para conectividade de SSH e de internet com sua instância do EC2.

1. **Opcional:** na **seção Configurações de rede**, em **Firewall (grupos de segurança)**, escolha **Criar grupo de segurança**.  
![\[A interface de configurações de rede mostrando opções para a criação de um grupo de segurança.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/firewall.png)

   Escolha **Criar grupo de segurança** (verifique todas as regras de permissão de tráfego que se apliquem à sua conectividade do EC2).
**nota**  
Se você quiser usar um grupo de segurança existente, siga as instruções em [Conectar o Amazon EC2 manualmente](connect-ec2-manual.md).

1. Na seção **Resumo**, revise sua configuração do EC2 e escolha **Iniciar instância**, se tudo estiver correto.

### Etapa 2: criar um cluster do Amazon DocumentDB
<a name="auto-connect-ec2.launch-cluster"></a>

Enquanto a instância do Amazon EC2 estiver sendo provisionada, crie seu cluster do Amazon DocumentDB. 

1. Navegue até o console do Amazon DocumentDB e escolha **Clusters** no painel de navegação.

1. Escolha **Criar**.

1. Deixe a configuração **Tipo de cluster** com o valor padrão, **Cluster baseado em instância**.

1. Em **Configuração do cluster**, em **Identificador do cluster**, insira um nome exclusivo. Observe que o console mudará todos os nomes de cluster para minúsculas, independentemente de como eles sejam inseridos.

   Deixe a **Versão do mecanismo** com o valor padrão de **5.0.0**.

1. Em **Configuração de armazenamento em cluster**, deixe a configuração padrão **Amazon DocumentDB Padrão**.

1. Em **Configuração da instância**:
   + Em **Classe de instância de banco de dados**, escolha **Classes otimizadas para memória (incluir classes r)** (esse é o padrão).

     A outra opção de instância são **classes NVMe apoiadas por -.** Para saber mais, consulte [Instâncias baseadas em NVMe](db-instance-nvme.md).
   + Em **Classe de instância**, escolha o tipo de instância que atende às suas necessidades. Para obter uma explicação mais detalhada das classes de instância, consulte [Especificações de classe de instância](db-instance-classes.md#db-instance-class-specs).
   + Em **número de casos**, escolha um número que melhor reflita suas necessidades. Lembre-se de que quanto menor o número, menor o custo e menor o read/write volume que pode ser gerenciado pelo cluster.  
![\[Interface de configuração com valores padrão para identificador de cluster, versão do mecanismo e classe de instância, com o número de instâncias definido como uma.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/create-cluster/instance-config.png)

1. Em **Conectividade**, escolha **Conectar-se a um recurso de computação do EC2**. Esta é a instância do EC2 criada na etapa 1.  
![\[Interface de conectividade com a opção Conectar-se a um recurso de computação do EC2 selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2-connect.png)
**nota**  
Conectar-se a um recurso computacional do EC2 cria automaticamente um grupo de segurança para a conexão de recursos computacionais do EC2 com seu cluster do Amazon DocumentDB. Quando você tiver concluído a criação do seu cluster e quiser ver o grupo de segurança recém-criado, navegue até a lista de clusters e escolha o identificador respectivo. Na guia **Conectividade e segurança**, acesse **Grupos de segurança** e encontre seu grupo em **Nome do grupo de segurança (ID)**. Ele conterá o nome do seu cluster e terá uma aparência semelhante a esta: `docdb-ec2-docdb-2023-12-11-21-33-41:i-0e4bb09985d2bbc4c (sg-0238e0b0bf0f73877)`.

1. Na seção **Autenticação**, insira um nome de usuário para o usuário principal e escolha **Autogerenciado**. Insira uma senha e confirme-a.

   Se, em vez disso, você escolher **Gerenciado em AWS Secrets Manager**, consulte [Gerenciamento de senhas com o Amazon DocumentDB e AWS Secrets Manager](docdb-secrets-manager.md) para obter mais informações.

1. Selecione **Criar cluster**.

### Etapa 3: conectar-se à instância do Amazon EC2
<a name="manual-connect-ec2.connect"></a>

Para instalar o shell do Mongo, você deve primeiro se conectar à sua instância do Amazon EC2. A instalação do shell do Mongo permite que você se conecte e consulte seu cluster do Amazon DocumentDB. Execute as etapas a seguir:

1. No console do Amazon EC2, navegue até suas instâncias e veja se a instância que você acabou de criar está em execução. Se for o caso, selecione a instância clicando no respectivo ID.  
![\[Tabela Instâncias listando duas instâncias no console do Amazon EC2.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/ec2-instance-table.png)

1. Selecione **Conectar**.  
![\[Resumo da instância para uma instância do Amazon EC2. O botão Conectar está localizado no canto superior direito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/ec2-instance-summary.png)

1. Você verá quatro guias de opções para seu método de conexão: Amazon EC2 Instance Connect, Session Manager, cliente SSH ou Console de Série do EC2. É necessário escolher um e seguir suas instruções. Ao concluir, escolha **Conectar**.  
![\[Interface mostrando as opções de configuração do método de conexão do EC2 Instance Connect.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/connect-options.png)

**nota**  
Se seu endereço IP mudou depois que você iniciou essa demonstração ou se você estiver voltando ao seu ambiente posteriormente, atualize a regra de entrada do grupo de segurança `demoEC2` para ativar o tráfego de entrada do seu novo endereço de API.

### Etapa 4: instalação do shell do MongoDB
<a name="auto-connect-ec2.install-mongo-shell"></a>

Agora o shell do MongoDB pode ser instalado. Ele é um utilitário de linha de comando que você usa para se conectar e consultar seu cluster do Amazon DocumentDB. Atualmente, existem duas versões do shell do MongoDB: a versão mais recente, mongosh, e a versão anterior, mongo shell.

**Importante**  
Há uma limitação conhecida com os drivers de NodeJS de versão anterior a 6.13.1, que atualmente não têm mais suporte para autenticação de identidades do IAM para o Amazon DocumentDB. Os drivers e ferramentas do Node.js que usam o driver Node.js (por exemplo, mongosh) devem ser atualizados para usar a versão 6.13.1 ou mais recente do driver de Node.js.

Siga as instruções abaixo para instalar o shell do MongoDB em seu sistema operacional.

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

**Para instalar o shell do MongoDB no Amazon Linux**

Se você *não* estiver usando a autenticação do IAM e quiser usar o shell mais recente do MongoDB (mongosh) para se conectar ao seu cluster do Amazon DocumentDB, siga estas etapas:

1. Crie o arquivo do repositório. Na linha de comando da instância do EC2 que você criou, digite o comando a seguir:

   ```
   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. Quando estiver concluído, instale o mongosh com uma das duas opções de comando a seguir no prompt de comando:

   **Opção 1**: se você escolheu o Amazon Linux 2023 padrão durante a configuração do Amazon EC2, insira este comando:

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

   **Opção 2**: se você escolheu o Amazon Linux 2 durante a configuração do Amazon EC2, insira este comando:

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

Se você estiver usando a autenticação do IAM, você deve usar a versão anterior do shell do MongoDB (5.0) para se conectar ao seu cluster do Amazon DocumentDB. Siga estas etapas:

1. Crie o arquivo do repositório. Na linha de comando da instância do EC2 que você criou, digite o comando a seguir:

   ```
   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. Quando estiver concluído, instale o shell do mongodb 5.0 com a opção de comando a seguir no prompt de comando:

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

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

**Para instalar o mongosh no Ubuntu**

1. Importe a chave pública que será usada pelo sistema de gerenciamento de pacotes.

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

1. Crie o arquivo de lista `mongodb-org-5.0.list` para o MongoDB usando o comando apropriado para a versão do Ubuntu.

   ```
   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. Importe e atualize o banco de dados de pacotes local usando o comando a seguir:

   ```
   sudo apt-get update
   ```

1. Instale o mongosh.

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

Para obter informações sobre como instalar versões anteriores do MongoDB no sistema do Ubuntu, consulte [Instalar o MongoDB Community Edition no Ubuntu](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/).

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

Para instalar o shell do Mongo em outros sistemas operacionais, consulte [Instalar o MongoDB Community Edition](https://www.mongodb.com/docs/manual/administration/install-community/) na documentação do MongoDB.

------

### Etapa 5: gerenciar o Amazon DocumentDB TLS
<a name="auto-connect-ec2.tls"></a>

Faça o download do certificado CA para o Amazon DocumentDB com o seguinte código: `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem` 

**nota**  
O Transport Layer Security (TLS) está habilitado por padrão para qualquer novo cluster do Amazon DocumentDB. Para obter mais informações, consulte [Gerenciamento de configurações de TLS do cluster do Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html).

### Etapa 6: conectar-se ao cluster do Amazon DocumentDB
<a name="auto-connect-ec2.connect-use"></a>

1. No console do Amazon DocumentDB, em **Clusters**, localize seu cluster. Escolha o cluster que você criou clicando no **identificador do cluster** desse cluster.

1. Na guia **Conectividade e segurança**, localize **Conectar a este cluster com o shell mongo** na caixa **Conectar**:  
![\[Configurações de conexão do cluster com a string de conexão do MongoDB destacada para se conectar a um cluster do Amazon DocumentDB usando o shell do mongo.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/connect-mongosh.png)

   Copie a string de conexão fornecida e cole-a no terminal.

   Faça as seguintes alterações:

   1. Certifique-se de que o nome de usuário correto está na string.

   1. Omita `<insertYourPassword>` para que você seja solicitado a fornecer a senha pelo shell mongo ao se conectar.

   1. Opcional: se você estiver usando a autenticação do IAM ou a versão anterior do shell do MongoDB, modifique sua string de conexão da forma a seguir:

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

      Substitua `mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1` pelas mesmas informações do seu cluster.

1. Pressione inserir no seu terminal. Agora você deverá fornecer sua senha. Insira a senha.

1. Ao inserir sua senha e ver o prompt `rs0 [direct: primary] <env-name>>`, você se conecta com êxito ao seu cluster do Amazon DocumentDB.

Está tendo problemas para se conectar? Consulte [Solução de problemas do Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html).

### Etapa 7: inserir e consultar dados
<a name="auto-cloud9-insert-query"></a>

Agora que você está conectado ao seu cluster, pode executar algumas consultas para se familiarizar com o uso de um banco de dados de documentos.

1. Para inserir um único documento, digite o seguinte:

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

   Você obterá o seguinte resultado:

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

1. É possível ler o documento que escreveu com o comando `findOne()` (porque ele retorna apenas um único documento). Insira o seguinte:

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

   Você obterá o seguinte resultado:

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

1. Para realizar mais algumas consultas, considere um caso de uso de perfis de jogos. Primeiro, insira algumas entradas em uma coleção intitulada `profiles`. Insira o seguinte:

   ```
   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 }
   ])
   ```

   Você obterá o seguinte resultado:

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

1. Use o `find()` comando para retornar todos os documentos na coleção de perfis. Insira o seguinte:

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

   Você obterá uma saída que corresponderá aos dados digitados na Etapa 3.

1. Use uma consulta para um único documento por meio de um filtro. Insira o seguinte:

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

   Você obterá o seguinte resultado:

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

1. Agora vamos tentar encontrar um perfil e modificá-lo usando o comando `findAndModify`. Atribuiremos ao usuário Matt mais 10z pontos com o código a seguir:

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

   Você obtém o seguinte resultado (observe que a pontuação dele ainda não aumentou):

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

1. É possível verificar se a pontuação dele mudou com a seguinte consulta:

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

   Você obterá a seguinte saída:

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

### Etapa 8: explorar
<a name="auto-connect-ec2.explore"></a>

Parabéns\$1 Você concluiu com êxito o Guia de início rápido do Amazon DocumentDB.

E depois? Saiba como aproveitar totalmente esse poderoso banco de dados com alguns de seus atributos populares:
+  [Gerenciar o Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/managing-documentdb.html) 
+  [Escalabilidade](https://docs.aws.amazon.com/documentdb/latest/developerguide/operational_tasks.html) 
+  [Fazer backup e restaurar](https://docs.aws.amazon.com/documentdb/latest/developerguide/backup_restore.html) 

**nota**  
Para economizar, é possível interromper seu cluster Amazon DocumentDB para reduzir custos ou excluir o cluster. Por padrão, após 30 minutos de inatividade, seu AWS Cloud9 ambiente interromperá a instância subjacente do Amazon EC2.

## Conectar automaticamente uma instância do EC2 a um banco de dados do Amazon DocumentDB existente
<a name="auto-connect-ec2-existing-cluster"></a>

Para o procedimento a seguir, pressupõe-se que você tenha um cluster do Amazon DocumentDB existente e uma instância do Amazon EC2 existente.

**Acessar seu cluster do Amazon DocumentDB e configure a conexão do Amazon EC2**

1. Acesse o cluster do Amazon DocumentDB.

   1. [Faça login no e abra Console de gerenciamento da AWS o console do Amazon DocumentDB em https://console.aws.amazon.com /docdb.](https://console.aws.amazon.com/docdb)

   1. No painel de navegação, escolha **Clusters**.
**dica**  
Caso não visualize o painel de navegação à esquerda da tela, selecione o ícone do menu (![\[Hamburger menu icon with three horizontal lines.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/docdb-menu-icon.png)) no canto superior esquerdo da página.

   1. Especifique o cluster que você quer escolhendo o botão à esquerda do nome do cluster.

1. Configure a conexão do Amazon EC2.

   1. Escolha **Ações** e **Configurar conexão do EC2**.  
![\[A lista suspensa Ações com a opção Configurar conexão do EC2 selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/setup-ec2-connect.png)

      A caixa de diálogo **Configurar conexão do EC2** é exibida.

   1. No campo **Instância do EC2**, escolha a instância do EC2 que você quer conectar ao cluster.  
![\[A interface Configurar conexão do EC2 com a lista suspensa de instâncias do EC2 em destaque.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/setup-ec2-connect-dialog.png)

   1. Escolha **Continuar**.

      A caixa de diálogo **Revisar e confirmar** é exibida.

   1. Verifique se as alterações estão corretas. Em seguida, escolha **Configurar conexão**.  
![\[A interface Revisar e confirmar mostrando o resumo das alterações. O botão Configurar conexão está localizado no canto inferior direito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/setup-ec2-review-confirm.png)

Se for bem-sucedida, a seguinte verificação será exibida:

![\[Mensagem de confirmação de uma configuração de conexão com êxito entre o banco de dados do Amazon DocumentDB e a instância do EC2.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/setup-ec2-connect-success.png)


## Visão geral da conectividade automática com uma instância do EC2
<a name="auto-connect-ec2.overview"></a>

Quando você configura uma conexão entre uma instância do EC2 e um banco de dados do Amazon DocumentDB, o Amazon DocumentDB automaticamente configura o grupo de segurança VPC para sua instância do EC2 e para seu banco de dados do Amazon DocumentDB.

Confira a seguir os requisitos para a conexão de uma instância do EC2 com um banco de dados do Amazon DocumentDB:
+ A instância do EC2 deve existir na mesma VPC do banco de dados do Amazon DocumentDB.

  Se não houver nenhuma instância do EC2 na mesma VPC, o console fornecerá um link para que você crie uma.
+ O usuário que configura a conectividade deve ter permissões para realizar as seguintes operações do Amazon EC2:
  + `ec2:AuthorizeSecurityGroupEgress`
  + `ec2:AuthorizeSecurityGroupIngress`
  + `ec2:CreateSecurityGroup`
  + `ec2:DescribeInstances`
  + `ec2:DescribeNetworkInterfaces`
  + `ec2:DescribeSecurityGroups`
  + `ec2:ModifyNetworkInterfaceAttribute`
  + `ec2:RevokeSecurityGroupEgress`

Se a instância de banco de dados e a instância do EC2 estiverem em zonas de disponibilidade diferentes, sua conta poderá incorrer em custos entre as zonas.

Quando você configura uma conexão com uma instância do EC2, o Amazon DocumentDB atua de acordo com a configuração atual dos grupos de segurança associados ao banco de dados do Amazon DocumentDB e à instância do EC2, conforme descrito na tabela a seguir:


| Configuração atual do grupo de segurança do Amazon DocumentDB | Configuração atual do grupo de segurança do EC2 | Ação do Amazon DocumentDB | 
| --- | --- | --- | 
| Há um ou mais grupos de segurança associados ao banco de dados do Amazon DocumentDB com um nome correspondente ao padrão DocumentDB-ec2-n. Um grupo de segurança que corresponde ao padrão não foi modificado. Esse grupo de segurança tem apenas uma regra de saída com o grupo de segurança da VPC da instância do EC2 como origem. | Há um ou mais grupos de segurança associados à instância do EC2 com um nome correspondente ao padrão DocumentDB-ec2-n (em que n é um número). Um grupo de segurança que corresponde ao padrão não foi modificado. Esse grupo de segurança tem apenas uma regra de saída com o grupo de segurança da VPC do banco de dados do Amazon DocumentDB como origem. | O Amazon DocumentDB não realiza nenhuma ação. Uma conexão já foi configurada automaticamente entre a instância do EC2 e o banco de dados do Amazon DocumentDB. Como já existe uma conexão entre a instância do EC2 e o banco de dados do Amazon DocumentDB, os grupos de segurança não são modificados. | 
| Qualquer uma das seguintes condições se aplica: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/connect-ec2-auto.html)  | Qualquer uma das seguintes condições se aplica: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/connect-ec2-auto.html) | Ação do Amazon DocumentDB: criar novos grupos de segurança | 
| Há um ou mais grupos de segurança associados ao banco de dados do Amazon DocumentDB com um nome correspondente ao padrão DocumentDB-ec2-n. Um grupo de segurança que corresponde ao padrão não foi modificado. Esse grupo de segurança tem apenas uma regra de saída com o grupo de segurança da VPC da instância do EC2 como origem. | Há um ou mais grupos de segurança associados à instância do EC2 com um nome que corresponde ao padrão ec2-DocumentDB-n. No entanto, o Amazon DocumentDB não pode usar nenhum desses grupos de segurança para a conexão com o banco de dados do Amazon DocumentDB. O Amazon DocumentDB não pode usar um grupo de segurança que não tenha uma regra de saída com o grupo de segurança da VPC do banco de dados do Amazon DocumentDB como origem. O Amazon DocumentDB também não pode usar um grupo de segurança que tenha sido modificado. | Ação do Amazon DocumentDB: criar novos grupos de segurança | 
| Há um ou mais grupos de segurança associados ao banco de dados do Amazon DocumentDB com um nome correspondente ao padrão DocumentDB-ec2-n. Um grupo de segurança que corresponde ao padrão não foi modificado. Esse grupo de segurança tem apenas uma regra de saída com o grupo de segurança da VPC da instância do EC2 como origem. | Existe um grupo de segurança do EC2 válido para a conexão, mas ele não está associado à instância do EC2. Esse grupo de segurança tem um nome que corresponde ao padrão DocumentDB-ec2-n. Não foi modificado. Ele tem apenas uma regra de saída com o grupo de segurança da VPC do banco de dados do Amazon DocumentDB como origem. | Ação do Amazon DocumentDB: associar o grupo de segurança do EC2 | 
| Qualquer uma das seguintes condições se aplica: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/connect-ec2-auto.html)  | Há um ou mais grupos de segurança associados à instância do EC2 com um nome que corresponde ao padrão DocumentDB-ec2-n. Um grupo de segurança que corresponde ao padrão não foi modificado. Esse grupo de segurança tem apenas uma regra de saída com o grupo de segurança da VPC do banco de dados do Amazon DocumentDB como origem. | Ação do Amazon DocumentDB: criar novos grupos de segurança | 

**Ação do Amazon DocumentDB: criar novos grupos de segurança**

O Amazon DocumentDB realiza as seguintes ações:
+ Cria um grupo de segurança que corresponde ao padrão `DocumentDB-ec2-n`. Esse grupo de segurança tem uma regra de entrada com o grupo de segurança da VPC da instância do EC2 como origem. Esse grupo de segurança está associado ao banco de dados do Amazon DocumentDB e permite que a instância do EC2 acesse o banco de dados do Amazon DocumentDB.
+ Cria um grupo de segurança que corresponde ao padrão `ec2-DocumentDB-n`. Esse grupo de segurança tem uma regra de saída com o grupo de segurança da VPC do banco de dados do Amazon DocumentDB como origem. Esse grupo de segurança está associado à instância do EC2 e permite que ela envie tráfego ao banco de dados do Amazon DocumentDB.

**Ação do Amazon DocumentDB: associar o grupo de segurança do EC2**

O Amazon DocumentDB associa o grupo de segurança do EC2 existente e válido à instância do EC2. Esse grupo de segurança permite que a instância do EC2 envie tráfego ao banco de dados do Amazon DocumentDB.

## Visualizar recursos computacionais conectados
<a name="auto-connect-ec2.compute"></a>

Você pode usar o Console de gerenciamento da AWS para visualizar os recursos computacionais conectados a um banco de dados Amazon DocumentDB. Os recursos mostrados incluem conexões de recursos computacionais que foram configuradas automaticamente. É possível configurar a conectividade com recursos computacionais automaticamente das seguintes maneiras:
+ É possível selecionar o recurso computacional ao criar o banco de dados. Para obter mais informações, consulte [Criar um cluster do Amazon DocumentDB](db-cluster-create.md) e Criar um cluster de banco de dados multi-AZ. 
+ É possível configurar a conectividade entre um banco de dados existente e um recurso computacional. Para obter mais informações, consulte [Conectar o Amazon EC2 automaticamente](#connect-ec2-auto). 

Os recursos computacionais listados não incluem aqueles que foram conectados manualmente ao banco de dados. Por exemplo, você pode permitir que um recurso computacional acesse um banco de dados manualmente adicionando uma regra ao grupo de segurança da VPC associado ao banco de dados.

Para que um recurso computacional seja listado, as seguintes condições devem ser atendidas:
+ O nome do grupo de segurança associado ao recurso computacional correspondente ao padrão `ec2-DocumentDB-n` (em que n é um número).
+ O grupo de segurança associado ao recurso computacional tem uma regra de saída com o intervalo de portas definido como a porta usada pelo banco de dados do Amazon DocumentDB.
+ O grupo de segurança associado ao recurso computacional tem uma regra de saída com a fonte definida como um grupo de segurança associado ao banco de dados do Amazon DocumentDB.
+ O nome do grupo de segurança associado ao banco de dados do Amazon DocumentDB corresponde ao padrão `DocumentDB-ec2-n` (em que n é um número).
+ O grupo de segurança associado ao banco de dados do Amazon DocumentDB dtem uma regra de entrada com o intervalo de portas definido como a porta usada pelo banco de dados do Amazon DocumentDB.
+ O grupo de segurança associado ao banco de dados do Amazon DocumentDB tem uma regra de entrada com a fonte definida como um grupo de segurança associado ao recurso computacional.

**Para visualizar recursos computacionais conectados a um banco de dados do Amazon DocumentDB**

1. [Faça login no e abra Console de gerenciamento da AWS o console do Amazon DocumentDB em https://console.aws.amazon.com /docdb.](https://console.aws.amazon.com/docdb)

1. No painel de navegação, escolha **Bancos de dados** e depois escolha o nome do banco de dados do Amazon DocumentDB.

1. Na guia **Conectividade e segurança**, veja os recursos computacionais na seção **Recursos computacionais conectados**.

# Conectar o Amazon EC2 manualmente
<a name="connect-ec2-manual"></a>

**Topics**
+ [

## Etapa 1: criar uma instância do Amazon EC2
](#manual-connect-ec2.launch-ec2-instance)
+ [

## Etapa 2: criar um grupo de segurança
](#manual-connect-ec2.security-group)
+ [

## Etapa 3: criar um cluster do Amazon DocumentDB
](#manual-connect-ec2.launch-cluster)
+ [

## Etapa 4: conectar a sua instância do Amazon EC2
](#manual-connect-ec2.connect)
+ [

## Etapa 5: instalação do shell do MongoDB
](#manual-connect-ec2.install-mongo-shell)
+ [

## Etapa 6: gerenciar o Amazon DocumentDB TLS
](#manual-connect-ec2.tls)
+ [

## Etapa 7: conectar ao cluster do Amazon DocumentDB
](#manual-connect-ec2.connect-use)
+ [

## Etapa 8: inserir e consultar dados
](#manual-cloud9-insert-query)
+ [

## Etapa 9: explorar
](#manual-connect-ec2.explore)

As etapas a seguir pressupõem que você concluiu as etapas do tópico [Pré-requisitos](connect-ec2.md#connect-ec2-prerequisites).

## Etapa 1: criar uma instância do Amazon EC2
<a name="manual-connect-ec2.launch-ec2-instance"></a>

Nesta etapa, você criará uma instância do Amazon EC2 na mesma região e na Amazon VPC que você usará posteriormente para provisionar seu cluster Amazon DocumentDB. 

1. No console do Amazon EC2, selecione **Iniciar instância**.  
![\[A seção Iniciar instância no console do Amazon EC2\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/launch-instance.png)

1. Insira um nome ou identificador no campo **Nome**, localizado na seção **Nome e tags**.

1. Na lista suspensa **Imagem de máquina da Amazon (AMI)**, localize a **AMI do Amazon Linux 2** e escolha-a.  
![\[A interface de imagens da aplicação e do sistema operacional com a opção Amazon Linux 2 AMI selecionada na seção Início rápido.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/linux2-ami.png)

1. Localize e escolha **t3.micro** na lista suspensa **Tipo de instância**.

1. Na seção **Par de chaves (login)** insira o identificador de um par de chaves existente ou selecione **Criar um novo par de chaves**.  
![\[A interface do par de chaves mostrando o campo de nome do par de chaves e a opção Criar novo par de chaves.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/key-pair.png)

   É necessário fornecer um par de chaves do Amazon EC2.
   + Se você tiver um par de chaves do Amazon EC2:

     1. Selecione um par de chaves, escolha seu par de chaves na lista.

     1. Você já deve ter o arquivo de chave privada (arquivo .pem ou .ppk) disponível para fazer login na instância do Amazon EC2.
   + Se você não tiver um par de chaves do Amazon EC2:

     1. Ao escolher **Criar novo par de chaves**, a caixa de diálogo **Criar par de chaves** é exibida.

     1. Insira um nome no campo **Nome do par de chaves**.

     1. Escolha o **Tipo de par de chaves** e o **Formato de arquivo de chave privada**. 

     1. Escolha **Create key pair (Criar par de chaves)**.  
![\[A interface Criar par de chaves com campos para nome, tipo e formato de arquivo do par de chaves. O botão Criar par de chaves está localizado no canto inferior direito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/create-key-pair.png)
**nota**  
Para fins de segurança, é altamente recomendável usar um par de chaves para conectividade de SSH e de internet com sua instância do EC2.

1. Na **seção Configurações de rede**, em **Firewall (grupos de segurança)**, escolha **Criar grupo de segurança** ou **Selecionar grupo de segurança existente**.  
![\[A interface de configurações de rede mostrando opções para a criação de um grupo de segurança.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/firewall.png)

   Se você optar por selecionar um grupo de segurança existente, selecione um na lista suspensa **Grupos de segurança comuns**.

   Se você optar por criar um novo grupo de segurança, faça o seguinte:

   1. Verifique todas as regras de permissão de tráfego que se aplicam à sua conectividade do EC2.

   1. No campo IP, escolha **Meu IP** ou selecione **Personalizado** para escolher em uma lista de blocos CIDR, listas de prefixos ou grupos de segurança. Não recomendamos **Qualquer lugar** como opção, a menos que sua instância do EC2 esteja em uma rede isolada, pois ela permite que qualquer endereço IP acesse sua instância do EC2.  
![\[O menu suspenso Meu IP.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/ip-field.png)

1. Na seção **Resumo**, revise sua configuração do EC2 e escolha **Iniciar instância**, se tudo estiver correto.

## Etapa 2: criar um grupo de segurança
<a name="manual-connect-ec2.security-group"></a>

Agora você criará um novo grupo de segurança em sua Amazon VPC padrão. O grupo de segurança `demoDocDB` permite que você se conecte ao seu cluster Amazon DocumentDB na porta 27017 (a porta padrão para o Amazon DocumentDB) a partir da sua instância do Amazon EC2. 

1. No [console de gerenciamento do Amazon EC2](https://console.aws.amazon.com/ec2), em **Rede e segurança**, escolha **Grupos de segurança**.  
![\[Painel de navegação do console do Amazon DocumentDB com a opção Grupos de segurança selecionada no menu suspenso Rede e Segurança.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/nav-security-groups.png)

1. Escolha **Criar grupo de segurança**.  
![\[O botão Criar grupo de segurança.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/create-sg-btn-2.png)

1. Na seção **Detalhes básicos**:

   1. Em **Nome do grupo de segurança**, insira `demoDocDB`.

   1. Em **Descrição**, insira uma descrição.

   1. Para **VPC**, aceite o uso da sua VPC padrão.

1. Na seção **Regras de entrada**, escolha **Adicionar regra**.

   1. Em **Tipo**, selecione **Regra TCP personalizada** (padrão).

   1. Em **Intervalo de portas**, insira `27017`.

   1. Em **Source**, escolha **Custom**. No campo ao lado, procure o grupo de segurança que você acabou de criar na etapa 1. Talvez seja necessário atualizar seu navegador para que o console do Amazon EC2 preencha automaticamente o nome da fonte.  
![\[Seção de regras de entrada mostrando campos para tipo, protocolo, intervalo de portas, origem e descrição. O botão Adicionar regra está localizado no canto inferior esquerdo.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/inbound-rules.png)

1. Aceite todos os outros padrões e escolha **Criar grupo de segurança**.  
![\[O botão Criar grupo de segurança.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/create-sg-btn-2.png)

## Etapa 3: criar um cluster do Amazon DocumentDB
<a name="manual-connect-ec2.launch-cluster"></a>

Enquanto a instância do Amazon EC2 estiver sendo provisionada, você criará seu cluster Amazon DocumentDB. 

1. Navegue até o console do Amazon DocumentDB e escolha **Clusters** no painel de navegação.

1. Escolha **Criar**.

1. Deixe a configuração **Tipo de cluster** com o valor padrão, **Cluster baseado em instância**.

1. Em **Configuração do cluster**, em **Identificador do cluster**, insira um nome exclusivo. Observe que o console mudará todos os nomes de cluster para minúsculas, independentemente de como eles sejam inseridos.

   Deixe a **Versão do mecanismo** com o valor padrão de **5.0.0**.

1. Em **Configuração de armazenamento em cluster**, deixe a configuração padrão **Amazon DocumentDB Padrão**.

1. Em **Configuração da instância**:
   + Em **Classe de instância de banco de dados**, escolha **Classes otimizadas para memória (incluir classes r)** (esse é o padrão).

     A outra opção de instância são **classes NVMe apoiadas por -.** Para saber mais, consulte [Instâncias baseadas em NVMe](db-instance-nvme.md).
   + Em **Classe de instância**, escolha o tipo de instância que atende às suas necessidades. Para obter uma explicação mais detalhada das classes de instância, consulte [Especificações de classe de instância](db-instance-classes.md#db-instance-class-specs).
   + Em **número de casos**, escolha um número que melhor reflita suas necessidades. Lembre-se de que quanto menor o número, menor o custo e menor o read/write volume que pode ser gerenciado pelo cluster.  
![\[Interface de configuração com valores padrão para identificador de cluster, versão do mecanismo e classe de instância, com o número de instâncias definido como uma.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/create-cluster/instance-config.png)

1. Em **Conectividade**, mantenha a configuração padrão **Não se conectar a um recurso computacional do EC2**.
**nota**  
A conexão com um recurso computacional do EC2 cria automaticamente grupos de segurança para a conexão com seu cluster. Como você criou manualmente esses grupos de segurança na etapa anterior, deverá selecionar **Não se conectar a um recurso computacional do EC2** para não criar um segundo conjunto de grupos de segurança.

1. Na seção **Autenticação**, insira um nome de usuário para o usuário principal e escolha **Autogerenciado**. Insira uma senha e confirme-a.

   Se, em vez disso, você escolher **Gerenciado em AWS Secrets Manager**, consulte [Gerenciamento de senhas com o Amazon DocumentDB e AWS Secrets Manager](docdb-secrets-manager.md) para obter mais informações.

1. Selecione **Criar cluster**.

## Etapa 4: conectar a sua instância do Amazon EC2
<a name="manual-connect-ec2.connect"></a>

Para instalar o shell do MongoDB, você deve primeiro se conectar à sua instância do Amazon EC2. A instalação do shell do Mongo permite que você se conecte e consulte seu cluster do Amazon DocumentDB. Execute as etapas a seguir:

1. No console do Amazon EC2, navegue até suas instâncias e veja se a instância que você acabou de criar está em execução. Se for o caso, selecione a instância clicando no respectivo ID.  
![\[Tabela Instâncias listando duas instâncias no console do Amazon EC2.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/ec2-instance-table.png)

1. Selecione **Conectar**.  
![\[Resumo da instância para uma instância do Amazon EC2. O botão Conectar está localizado no canto superior direito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/ec2-instance-summary.png)

1. Você verá quatro guias de opções para seu método de conexão: Amazon EC2 Instance Connect, Session Manager, cliente SSH ou Console de Série do EC2. É necessário escolher um e seguir suas instruções. Ao concluir, escolha **Conectar**.  
![\[Interface mostrando as opções de configuração do método de conexão do EC2 Instance Connect.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ec2/connect-options.png)

**nota**  
Se seu endereço IP mudou depois que você iniciou essa demonstração ou se você estiver voltando ao seu ambiente posteriormente, atualize a regra de entrada do grupo de segurança `demoEC2` para ativar o tráfego de entrada do seu novo endereço de API.

## Etapa 5: instalação do shell do MongoDB
<a name="manual-connect-ec2.install-mongo-shell"></a>

Agora o shell do MongoDB pode ser instalado. Ele é um utilitário de linha de comando que você usa para se conectar e consultar seu cluster do Amazon DocumentDB. Atualmente, existem duas versões do shell do MongoDB: a versão mais recente, mongosh, e a versão anterior, mongo shell.

**Importante**  
Há uma limitação conhecida com os drivers de NodeJS de versão anterior a 6.13.1, que atualmente não têm mais suporte para autenticação de identidades do IAM para o Amazon DocumentDB. Os drivers e ferramentas do Node.js que usam o driver Node.js (por exemplo, mongosh) devem ser atualizados para usar a versão 6.13.1 ou mais recente do driver de Node.js.

Siga as instruções abaixo para instalar o shell do MongoDB em seu sistema operacional.

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

**Para instalar o shell do MongoDB no Amazon Linux**

Se você *não* estiver usando o IAM e quiser usar o shell mais recente do MongoDB (mongosh) para se conectar ao seu cluster do Amazon DocumentDB, siga estas etapas:

1. Crie o arquivo do repositório. Na linha de comando da instância do EC2 que você criou, digite o comando a seguir:

   ```
   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. Quando estiver concluído, instale o mongosh com uma das duas opções de comando a seguir no prompt de comando:

   **Opção 1**: se você escolheu o Amazon Linux 2023 padrão durante a configuração do Amazon EC2, insira este comando:

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

   **Opção 2**: se você escolheu o Amazon Linux 2 durante a configuração do Amazon EC2, insira este comando:

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

Se você estiver usando o IAM, você deve usar a versão anterior do shell do MongoDB (5.0) para se conectar ao seu cluster do Amazon DocumentDB. Siga estas etapas:

1. Crie o arquivo do repositório. Na linha de comando da instância do EC2 que você criou, digite o comando a seguir:

   ```
   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. Quando estiver concluído, instale o shell do mongodb 5.0 com a opção de comando a seguir no prompt de comando:

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

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

**Para instalar o mongosh no Ubuntu**

1. Importe a chave pública que será usada pelo sistema de gerenciamento de pacotes.

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

1. Crie o arquivo de lista `mongodb-org-5.0.list` para o MongoDB usando o comando apropriado para a versão do Ubuntu.

   ```
   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. Importe e atualize o banco de dados de pacotes local usando o comando a seguir:

   ```
   sudo apt-get update
   ```

1. Instale o mongosh.

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

Para obter informações sobre como instalar versões anteriores do MongoDB no sistema do Ubuntu, consulte [Instalar o MongoDB Community Edition no Ubuntu](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/).

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

Para instalar o shell do Mongo em outros sistemas operacionais, consulte [Instalar o MongoDB Community Edition](https://www.mongodb.com/docs/manual/administration/install-community/) na documentação do MongoDB.

------

## Etapa 6: gerenciar o Amazon DocumentDB TLS
<a name="manual-connect-ec2.tls"></a>

Faça o download do certificado CA para o Amazon DocumentDB com o seguinte código: `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem` 

**nota**  
O Transport Layer Security (TLS) está habilitado por padrão para qualquer novo cluster do Amazon DocumentDB. Para obter mais informações, consulte [Gerenciamento de configurações de TLS do cluster do Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html).

## Etapa 7: conectar ao cluster do Amazon DocumentDB
<a name="manual-connect-ec2.connect-use"></a>

1. No console do Amazon DocumentDB, em **Clusters**, localize seu cluster. Escolha o cluster que você criou clicando no **identificador do cluster** desse cluster.  
![\[Lista de clusters do Amazon DocumentDB mostrando um cluster regional com detalhes da instância primária.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/cluster-connect-choose.png)

1. Na guia **Conectividade e segurança**, localize **Conectar a este cluster com o shell mongo** na caixa **Conectar**:  
![\[Configurações de conexão do cluster com a string de conexão do MongoDB destacada para se conectar a um cluster do Amazon DocumentDB usando o shell do mongo.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/connect-mongosh.png)

   Copie a string de conexão fornecida e cole-a no terminal.

   Faça as seguintes alterações:

   1. Certifique-se de que o nome de usuário correto está na string.

   1. Omita `<insertYourPassword>` para que você seja solicitado a fornecer a senha pelo shell mongo ao se conectar.

   1. Opcional: se você estiver usando a autenticação do IAM ou a versão anterior do shell do MongoDB, modifique sua string de conexão da forma a seguir:

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

      Substitua `mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1` pelas mesmas informações do seu cluster.

1. Pressione inserir no seu terminal. Agora você deverá fornecer sua senha. Insira a senha.

1. Ao inserir sua senha e ver o prompt `rs0 [direct: primary] <env-name>>`, você se conecta com êxito ao seu cluster do Amazon DocumentDB.

Está tendo problemas para se conectar? Consulte [Solução de problemas do Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html).

## Etapa 8: inserir e consultar dados
<a name="manual-cloud9-insert-query"></a>

Agora que você está conectado ao seu cluster, pode executar algumas consultas para se familiarizar com o uso de um banco de dados de documentos.

1. Para inserir um único documento, digite o seguinte:

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

   Você obterá o seguinte resultado:

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

1. É possível ler o documento que escreveu com o comando `findOne()` (porque ele retorna apenas um único documento). Insira o seguinte:

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

   Você obterá o seguinte resultado:

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

1. Para realizar mais algumas consultas, considere um caso de uso de perfis de jogos. Primeiro, insira algumas entradas em uma coleção intitulada `profiles`. Insira o seguinte:

   ```
   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 }
   ])
   ```

   Você obterá o seguinte resultado:

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

1. Use o `find()` comando para retornar todos os documentos na coleção de perfis. Insira o seguinte:

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

   Você obterá uma saída que corresponderá aos dados digitados na Etapa 3.

1. Use uma consulta para um único documento por meio de um filtro. Insira o seguinte:

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

   Você obterá o seguinte resultado:

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

1. Agora vamos tentar encontrar um perfil e modificá-lo usando o comando `findAndModify`. Atribuiremos ao usuário Matt mais 10z pontos com o código a seguir:

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

   Você obtém o seguinte resultado (observe que a pontuação dele ainda não aumentou):

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

1. É possível verificar se a pontuação dele mudou com a seguinte consulta:

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

   Você obterá o seguinte resultado:

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

## Etapa 9: explorar
<a name="manual-connect-ec2.explore"></a>

Parabéns\$1 Você concluiu com êxito o Guia de início rápido do Amazon DocumentDB.

E depois? Saiba como aproveitar totalmente esse poderoso banco de dados com alguns de seus atributos populares:
+  [Gerenciar o Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/managing-documentdb.html) 
+  [Escalabilidade](https://docs.aws.amazon.com/documentdb/latest/developerguide/operational_tasks.html) 
+  [Fazer backup e restaurar](https://docs.aws.amazon.com/documentdb/latest/developerguide/backup_restore.html) 

**nota**  
Para economizar, é possível interromper seu cluster Amazon DocumentDB para reduzir custos ou excluir o cluster. Por padrão, após 30 minutos de inatividade, seu AWS Cloud9 ambiente interromperá a instância subjacente do Amazon EC2.

# Conecte-se usando o driver JDBC do Amazon DocumentDB
<a name="connect-jdbc"></a>

O driver JDBC para o Amazon DocumentDB fornece uma interface relacional SQL para desenvolvedores e permite a conectividade a partir de ferramentas de BI, como Tableau e. DbVisualizer

Para obter informações mais detalhadas, consulte a documentação do [Amazon DocumentDB JDBC Driver](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/index.md) em. GitHub

**Topics**
+ [

## Introdução
](#connect-jdbc-gettingstarted)
+ [

# Conecte-se ao Amazon DocumentDB a partir do Tableau Desktop
](connect-jdbc-tableau.md)
+ [

# Conecte-se ao Amazon DocumentDB a partir de DbVisualizer
](connect-jdbc-DbVisualizer.md)
+ [

# Geração automática de esquema JDBC
](connect-jdbc-autoschemagen.md)
+ [

# Suporte e limitações do SQL
](connect-jdbc-sqlandlimits.md)
+ [

# Solução de problemas
](connect-jdbc-troubleshooting.md)

## Introdução
<a name="connect-jdbc-gettingstarted"></a>

**Etapa 1. Criar Amazon DocumentDB Cluster**  
Se você não tiver um cluster do Amazon DocumentDB criado, crie um usando as instruções na seção [Conceitos básicos](https://docs.aws.amazon.com/documentdb/latest/developerguide/get-started-guide.html) do Guia do desenvolvedor do Amazon DocumentDB.  
O Amazon DocumentDB é um serviço somente de nuvem privada virtual (VPC). Se você estiver se conectando a partir de uma máquina local, fora da VPC do cluster, precisará criar uma conexão SSH com uma instância do Amazon EC2. Nesse caso, inicie seu cluster usando as instruções em [Conecte-se com EC2](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html). Consulte [Usar um túnel SSH para se conectar ao 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) para obter mais informações sobre tunelamento SSH e quando você precisar dele. 

**Etapa 2. Instalação do JRE ou JDK**  
Dependendo da sua aplicação de BI, talvez seja necessário garantir que uma versão 8 ou posterior da instalação do JRE ou JDK de 64 bits esteja instalada no seu computador. É possível fazer o download do Java SE Runtime Environment 8 [aqui](https://www.oracle.com/ca-en/java/technologies/javase-jre8-downloads.html).

**Etapa 3. Faça o download do driver JDBC DocumentDB**  
Faça o download do driver JDBC do DocumentDB [aqui](https://github.com/aws/amazon-documentdb-jdbc-driver/releases). O driver é empacotado como um único arquivo JAR (por exemplo, documentdb-jdbc-1.0.0-all.jar).

**Etapa 4: Usando um túnel SSH para se conectar ao Amazon DocumentDB**  
Os clusters do Amazon DocumentDB (compatível com MongoDB) são implantados dentro de uma Amazon Virtual Private Cloud (Amazon VPC). Eles podem ser acessados diretamente por instâncias do Amazon EC2 ou outros AWS serviços implantados na mesma Amazon VPC. Além disso, o Amazon DocumentDB pode ser acessado por EC2a instâncias ou outros AWS serviços diferentes na mesma AWS região ou VPCs em outras regiões por meio do emparelhamento de VPC.  
É possível usar o tunelamento SSH (também conhecido como encaminhamento de portas) para acessar seus recursos do Amazon DocumentDB, de fora da VPC do cluster. Esse será o caso da maioria dos usuários que não executam suas aplicações em uma VM na mesma VPC do cluster DocumentDB.  
Para criar um túnel SSH, você precisa de uma instância do Amazon EC2 em execução na mesma Amazon VPC que seu cluster do Amazon DocumentDB. É possível usar uma instância do EC2 existente na mesma VPC que seu cluster ou criar uma instância. É possível configurar um túnel SSH para o cluster do Amazon DocumentDB `sample-cluster.node.us-east-1.docdb.amazonaws.com` executando o seguinte comando em seu computador local.  

```
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 
```
O sinalizador -L é usado para encaminhar uma porta local. Esse é um pré-requisito para se conectar a qualquer ferramenta de BI em execução em um cliente fora da sua VPC. Depois de executar a etapa acima, você pode passar para as próximas etapas da ferramenta de BI de sua escolha.   
Para obter mais informações sobre o tunelamento SSH, consulte a documentação sobre [Como usar um túnel SSH para se conectar ao 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 ).

# Conecte-se ao Amazon DocumentDB a partir do Tableau Desktop
<a name="connect-jdbc-tableau"></a>

**Topics**
+ [

## Adicionar o driver JDBC do Amazon DocumentDB
](#connect-jdbc-tableau-adddriver)
+ [

## Conectar-se ao Amazon DocumentDB usando o Tableau - Túnel SSH
](#connect-jdbc-tableau-ssh)

## Adicionar o driver JDBC do Amazon DocumentDB
<a name="connect-jdbc-tableau-adddriver"></a>

Para se conectar ao Amazon DocumentDB a partir do Tableau Desktop, você deve fazer o download e instalar o driver JDBC do Amazon DocumentDB e o conector DocumentDB Tableau.

1. Faça o download do arquivo JAR do driver JDBC do Amazon DocumentDB no [repositório do driver JDBC do Amazon DocumentDB](https://github.com/aws/amazon-documentdb-jdbc-driver/releases) e copie-o em um desses diretórios de acordo com seu sistema operacional:
   + *Windows* - `C:\Program Files\Tableau\Drivers`
   + *MacOS* - `~/Library/Tableau/Drivers`

1. *Baixe o conector DocumentDB Tableau (um arquivo TACO) do [site do Tableau Exchange](https://exchange.tableau.com/products/821) e copie-o para o diretório Meu Tableau. Repository/Connectors *
   + *Windows* - `C:\Users\[user]\Documents\My Tableau Repository\Connectors`
   + *MacOS* - `/Users/[user]/Documents/My Tableau Repository/Connectors`

Para obter informações, consulte a [Documentação do Tableau](https://tableau.github.io/connector-plugin-sdk/docs/run-taco).

**nota**  
[Se você estiver usando certificados CA mais recentes, certifique-se de atualizar seu driver JDBC para a versão v1.4.5 (disponível neste repositório). AWS GitHub ](https://github.com/aws/amazon-documentdb-jdbc-driver/releases/tag/v1.4.5)

## Conectar-se ao Amazon DocumentDB usando o Tableau - Túnel SSH
<a name="connect-jdbc-tableau-ssh"></a>

Para se conectar ao Tableau a partir de uma máquina cliente fora da VPC do seu cluster do DocumentDB, você deve configurar um túnel SSH antes de seguir as etapas abaixo:

1. Inicie a aplicação Tableau Desktop.

1. Navegue até **Connect** > **To A Server** > **More**. 

1.  Escolha **Amazon DocumentDB da Amazon Web Services** em **Conectores instalados**.  
![\[A interface Conectar no Tableau Desktop mostra o submenu Mais... na seção A um servidor. A opção Amazon DocumentDB está destacada no submenu Conectores instalados.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/tableau-choose-docdb.png)

**Conectar-se ao Amazon DocumentDB usando o Tableau - Túnel SSH externo**

1. Insira os parâmetros de conexão necessários **Nome do host**, **porta**, **banco de dados**, **nome de usuário** e **senha**. Os parâmetros de conexão no exemplo abaixo são equivalentes à cadeia de conexão JDBC: 

   `jdbc:documentdb://localhost:27019/test? tls=true&tlsAllowInvalidHostnames=true&scanMethod=random&scanLimit=1000&loginTimeoutSec=0&readPreference=primary&retryReads=true&schemaName=_default` com os parâmetros de nome de usuário e senha passados separadamente em uma coleção de propriedades. Para obter mais informações sobre os parâmetros da cadeia de conexão, consulte a documentação do github do [driver JDBC do Amazon DocumentDB ](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/setup/connection-string.md).   
![\[Guia geral na interface do conector Amazon DocumentDB mostrando os campos de nome do host, porta, banco de dados, nome de usuário e senha.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/tableau-connect.png)

1. (Opcional) Opções mais avançadas podem ser encontradas na guia **Avançado**.  
![\[Guia avançada na interface do conector Amazon DocumentDB mostrando opções adicionais de conexão.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/tableau-advanced.png)

1. Escolha **Logon**.

**Conectar-se ao Amazon DocumentDB usando o Tableau - Túnel SSH interno**
**nota**  
Se você preferir não configurar o túnel SSH usando um terminal, você pode usar a GUI do Tableau para especificar os detalhes da sua instância EC2, que o driver JDBC usará inerentemente para criar um túnel SSH. 

1. Na guia **Avançado**, escolha a **opção Ativar túnel SSH** para revisar outras propriedades.  
![\[Guia avançada na interface do conector Amazon DocumentDB com a opção Ativar túnel de SSH selecionada e campos de entrada de SSH adicionais mostrados.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/tableau-advanced-Enablessh.png)

1. Insira o **usuário SSH**, o **nome do host SSH** e o **arquivo de chave privada SSH.** 

1. (Opcional) É possível desativar a opção **SSH Strict Host Key Check**, que ignora a verificação da chave do host em relação a um arquivo host conhecido.
**nota**  
Desativar essa opção é menos seguro, pois pode levar a um [man-in-the-middle](https://en.wikipedia.org/wiki/Man-in-the-middle_attack)ataque.  
![\[Guia avançada na interface do conector Amazon DocumentDB com a opção Verificação rigorosa da chave do host de SSH desabilitada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/tableau-advanced-sshhostkeycheck.png)

1. Insira os parâmetros necessários; **Nome do host**, **porta**, **banco de dados**, **nome de usuário** e **senha**.
**nota**  
Certifique-se de usar o endpoint do cluster DocumentDB e não o localhost ao usar a opção de túnel SSH interno.  
![\[Guia geral na interface do conector Amazon DocumentDB mostrando os campos de nome do host, porta, banco de dados, nome de usuário e senha.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/tableau-hostname.png)

1. Selecione **Fazer login**.

# Conecte-se ao Amazon DocumentDB a partir de DbVisualizer
<a name="connect-jdbc-DbVisualizer"></a>

**Topics**
+ [

## Adicionar o driver JDBC do Amazon DocumentDB
](#connect-jdbc-DbVisualizer-adddriver)
+ [

## Conectando-se ao Amazon DocumentDB usando DbVisualizer
](#connect-jdbc-DbVisualizer-connect)

## Adicionar o driver JDBC do Amazon DocumentDB
<a name="connect-jdbc-DbVisualizer-adddriver"></a>

Para se conectar ao Amazon DocumentDB, DbVisualizer você deve primeiro importar o driver JDBC do Amazon DocumentDB.

1. Inicie o DbVisualizer aplicativo e navegue até o caminho do menu: **Ferramentas > Gerenciador de drivers...**

1. Escolha **\$1** (ou, no menu, selecione **Driver > Criar driver**).

1. Defina **Name (Nome)** como `DocumentDB`.

1. Defina **o formato do URL** como `jdbc:documentdb://<host>[:port]/<database>[?option=value[&option=value[...]]]`

1. Escolha o botão de **pasta** e, em seguida, selecione o arquivo JAR do driver JDBC Amazon DocumentDB e escolha o botão **Abrir.**

1. Verifique se o campo **Classe do motorista** está definido como`software.amazon.documentdb.jdbc.DocumentDbDriver`. As configurações do Driver Manager do **DocumentDB** devem ser como o exemplo a seguir.  
![\[Interface de configurações de driver DbVisualizer com as configurações de nome, formato de URL e classe de driver do Amazon DocumentDB inseridas.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/DbVisualizer-adddriver.jpg)

1. Feche o diálogo. O driver JDBC do Amazon DocumentDB estará configurado e pronto para uso.

## Conectando-se ao Amazon DocumentDB usando DbVisualizer
<a name="connect-jdbc-DbVisualizer-connect"></a>

Conecte-se ao Amazon DocumentDB usando DbVisualizer

1. Se você estiver se conectando de fora da VPC do cluster Amazon DocumentDB, certifique-se de ter configurado um túnel SSH.

1. Escolha **Banco de dados > Criar conexão de banco de dados** no menu de nível superior.

1. Insira um nome descritivo para o campo **Name**.

1. Defina o **Driver (JDBC)** como o driver DocumentDB que você criou na seção anterior.

1. Defina o **URL do banco** de dados como sua string de conexão JDBC. 

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

1. Defina **Database Userid** como sua ID de usuário do Amazon DocumentDB.

1. Defina a **Senha do Banco de Dados** como a senha correspondente para a ID do usuário.

   A caixa de diálogo de Conexão do Banco de Dados deve ter a seguinte aparência:  
![\[Interface de conexão de banco de dados com configurações do DocumentDB.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/DbVisualizer-connect.jpg)

1. Selecione **Conectar**.

# Geração automática de esquema JDBC
<a name="connect-jdbc-autoschemagen"></a>

O Amazon DocumentDB é um banco de dados de documentos e, portanto, não tem o conceito de tabelas e esquemas. No entanto, ferramentas de BI, como o Tableau, esperam que o banco de dados conectado apresente um esquema. Especificamente, quando a conexão do driver JDBC precisar obter o esquema da coleção no banco de dados, ela pesquisará todas as coleções no banco de dados. O driver determinará se já existe uma versão em cache do esquema dessa coleção. Se uma versão em cache não existir, ela fará uma amostra da coleção para documentos e criará um esquema com base no comportamento a seguir. 

**Topics**
+ [

## Limitações de geração de esquemas
](#connect-jdbc-autoschemagen-limits)
+ [

## Opções do método de verificação
](#connect-jdbc-autoschemagen-scanningoptions)
+ [

## Tipos de dados do Amazon DocumentDB
](#connect-jdbc-autoschemagen-datatypes)
+ [

## Mapeamento de campos de documentos escalares
](#connect-jdbc-autoschemagen-scalarfields)
+ [

## Manipulação de tipos de dados de objetos e matrizes
](#connect-jdbc-autoschemagen-objectandarray)

## Limitações de geração de esquemas
<a name="connect-jdbc-autoschemagen-limits"></a>

O driver JDBC DocumentDB impõe um limite no tamanho dos identificadores em 128 caracteres. O gerador de esquema pode truncar o comprimento dos identificadores gerados (nomes de tabelas e nomes de colunas) para garantir que eles se encaixem nesse limite. 

## Opções do método de verificação
<a name="connect-jdbc-autoschemagen-scanningoptions"></a>

O comportamento da amostragem pode ser modificado usando as opções de cadeia de conexão ou fonte de dados.
+ *scanMethod=*<option>
  + *random - (padrão) - Os documentos de amostra são retornados em ordem aleatória.*
  + *idForward* - Os documentos de amostra são devolvidos na ordem de identificação.
  + *idReverse* - Os documentos de amostra são retornados na ordem inversa da identificação.
  + *tudo* - Faça uma amostra de todos os documentos da coleção.
+ *ScanLimit=* <n>- O número de documentos a serem amostrados. O valor deve ser um inteiro positivo. O valor padrão é *1000*. Se *ScanMethod* estiver definido como *tudo*, essa opção será ignorada.

## Tipos de dados do Amazon DocumentDB
<a name="connect-jdbc-autoschemagen-datatypes"></a>

O servidor do Amazon DocumentDB suporta vários tipos de dados do MongoDB. Listados abaixo estão os tipos de dados compatíveis e seus tipos de dados JDBC associados.


| Tipos de dados MongoDB | Compatível com o DocumentDB | Tipo de dados JDBC | 
| --- | --- | --- | 
| Dados binários | Sim | VARBINARY | 
| Boolean | Sim | BOOLEAN | 
| Duplo | Sim | DOUBLE | 
| 32-bit Integer | Sim | INTEGER | 
| 64-bit Integer | Sim | BIGINT | 
| String | Sim | VARCHAR | 
| ObjectId | Sim | VARCHAR | 
| Data | Sim | TIMESTAMP | 
| Null | Sim | VARCHAR | 
| Expressão Regular | Sim | VARCHAR | 
| Timestamp | Sim | VARCHAR | 
| MinKey | Sim | VARCHAR | 
| MaxKey | Sim | VARCHAR | 
| Objeto | Sim | tabela virtual | 
| Array | Sim | tabela virtual | 
| Decimal128 | Não | DECIMAL | 
| JavaScript | Não | VARCHAR | 
| JavaScript (com escopo) | Não | VARCHAR | 
| Não definido | Não | VARCHAR | 
| Símbolo | Não | VARCHAR | 
| DBPointer (4.0\$1) | Não | VARCHAR | 

## Mapeamento de campos de documentos escalares
<a name="connect-jdbc-autoschemagen-scalarfields"></a>

Ao digitalizar uma amostra de documentos de uma coleção, o driver JDBC criará um ou mais esquemas para representar as amostras na coleção. Em geral, um campo escalar no documento é mapeado para uma coluna no esquema da tabela. Por exemplo, em uma coleção chamada team e em um único documento`{ "_id" : "112233", "name" : "Alastair", "age": 25 }`, isso seria mapeado para o esquema:


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| equipe | id da equipe | VARCHAR | PK | 
| equipe | name | VARCHAR |  | 
| equipe | idade | INTEGER |  | 

### Promoção de conflitos de tipos de dados
<a name="connect-jdbc-autoschemagen-conflictpromo"></a>

Ao digitalizar os documentos de amostra, é possível que os tipos de dados de um campo não sejam consistentes de documento para documento. Nesse caso, o driver JDBC promoverá o tipo de dados JDBC a um tipo de dado comum adequado a todos os tipos de dados dos documentos de amostra. 

Por exemplo:

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

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

O campo de *idade* é do tipo inteiro de 32 bits no primeiro documento, mas string no segundo documento. Aqui, o driver JDBC promoverá o tipo de dados JDBC para VARCHAR para lidar com qualquer tipo de dados quando encontrado.


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| equipe | id da equipe | VARCHAR | PK | 
| equipe | name | VARCHAR |  | 
| equipe | idade | VARCHAR |  | 

### Promoção de conflitos escalar-escalares
<a name="connect-jdbc-autoschemagen-scalarconflictpromo"></a>

O diagrama a seguir mostra a maneira pela qual os conflitos de tipo de dados escalar-escalar são resolvidos.

![\[Diagrama de hierarquia mostrando como tipos de dados conflitantes serão promovidos quando não forem consistentes nos documentos.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/jdbc/scalar-scalar-promotion.png)


### Promoção de conflitos do tipo complexo escalar
<a name="connect-jdbc-autoschemagen-scalar-complex"></a>

Assim como os conflitos do tipo escalar-escalar, o mesmo campo em documentos diferentes pode ter tipos de dados conflitantes entre complexos (matriz e objeto) e escalares (inteiro, booleano etc.). Todos esses conflitos são resolvidos (promovidos) à VARCHAR nesses campos. Nesse caso, os dados da matriz e do objeto são retornados como a representação JSON.

Matriz incorporada - Exemplo de conflito de campo de string:

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

O exemplo acima mapeia o esquema da tabela customer2: 


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| customer2 | customer2 id | VARCHAR | PK | 
| customer2 | name | VARCHAR |  | 
| customer2 |  Assinatura | VARCHAR |  | 

e a tabela virtual customer1\$1subscriptions:


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| customer1\$1subscriptions | customer1 id | VARCHAR | PK/FK | 
| customer1\$1subscriptions | subscriptions\$1index\$1lvl0 | BIGINT | PK | 
| customer1\$1subscriptions | valor | VARCHAR |  | 
| customer\$1address | cidade | VARCHAR |  | 
| customer\$1address | region | VARCHAR |  | 
| customer\$1address | país | VARCHAR |  | 
| customer\$1address | código | VARCHAR |  | 

## Manipulação de tipos de dados de objetos e matrizes
<a name="connect-jdbc-autoschemagen-objectandarray"></a>

Até agora, descrevemos apenas como os tipos de dados escalares são mapeados. Os tipos de dados de objeto e matriz são (atualmente) mapeados para tabelas virtuais. O driver JDBC criará uma tabela virtual para representar campos de objetos ou matrizes em um documento. O nome da tabela virtual mapeada concatenará o nome da coleção original seguido pelo nome do campo separado pelo caractere sublinhado (“\$1”).

A chave primária da tabela base (“\$1id”) assume um novo nome na nova tabela virtual e é fornecida como uma chave externa para a tabela base associada.

Para campos do tipo matriz incorporada, as colunas de índice são geradas para representar o índice na matriz em cada nível da matriz.

### Exemplo de campo de objeto incorporado
<a name="connect-jdbc-autoschemagen-embededobj"></a>

Para campos de objeto em um documento, um mapeamento para uma tabela virtual é criado pelo driver JDBC.

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

O exemplo acima mapeia o esquema da tabela de clientes: 


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| customer | customer id | VARCHAR | PK | 
| customer | name | VARCHAR |  | 

e a tabela virtual customer\$1address:


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| customer\$1address | customer id | VARCHAR | PK/FK | 
| customer\$1address | address1 | VARCHAR |  | 
| customer\$1address | address2 | VARCHAR |  | 
| customer\$1address | cidade | VARCHAR |  | 
| customer\$1address | region | VARCHAR |  | 
| customer\$1address | país | VARCHAR |  | 
| customer\$1address | código | VARCHAR |  | 

### Exemplo de campo de matriz incorporada
<a name="connect-jdbc-autoschemagen-embedarray"></a>

Para campos de matriz em um documento, um mapeamento para uma tabela virtual também é criado pelo driver JDBC.

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

O exemplo acima mapeia o esquema da tabela customer1: 


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| customer1 | customer1 id | VARCHAR | PK | 
| customer1 | name | VARCHAR |  | 

e a tabela virtual customer1\$1subscriptions:


| Nome da tabela | Nome da coluna | Tipo de dado | Chave | 
| --- | --- | --- | --- | 
| customer1\$1subscriptions | customer1 id | VARCHAR | PK/FK | 
| customer1\$1subscriptions | subscriptions\$1index\$1lvl0 | BIGINT | PK | 
| customer1\$1subscriptions | valor | VARCHAR |  | 
| customer\$1address | cidade | VARCHAR |  | 
| customer\$1address | region | VARCHAR |  | 
| customer\$1address | país | VARCHAR |  | 
| customer\$1address | código | VARCHAR |  | 

# Suporte e limitações do SQL
<a name="connect-jdbc-sqlandlimits"></a>

O driver JDBC do Amazon DocumentDB é um driver somente para leitura que suporta um subconjunto do SQL-92 e algumas extensões comuns. Consulte a documentação de [limitações de SQL](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/sql/sql-limitations.md) e a [documentação de limitações de JDBC](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/jdbc/jdbc-limitations.md) para obter mais informações. 

# Solução de problemas
<a name="connect-jdbc-troubleshooting"></a>

Se você estiver tendo problemas ao usar o driver JDBC do Amazon DocumentDB, consulte o [Guia de solução de problemas](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/support/troubleshooting-guide.md). 

# Conecte-se usando o driver ODBC do Amazon DocumentDB
<a name="connect-odbc"></a>

O driver ODBC para o Amazon DocumentDB fornece uma interface SQL relacional para desenvolvedores e permite a conectividade a partir de ferramentas de BI, como Power BI Desktop e Microsoft Excel.

Para obter informações mais detalhadas, consulte a documentação do [driver ODBC do Amazon DocumentDB no GitHub](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/index.md).

**Topics**
+ [

## Começar
](#connect-odbc-get-started)
+ [

# Configurar o driver ODBC do Amazon DocumentDB no Windows
](connect-odbc-setup-windows.md)
+ [

# Conecte-se ao Amazon DocumentDB a partir do Microsoft Excel
](connect-odbc-excel.md)
+ [

# Conecte-se ao Amazon DocumentDB a partir do Microsoft Power BI Desktop
](connect-odbc-power-bi.md)
+ [

# Geração automática de esquemas
](connect-odbc-schema.md)
+ [

# Suporte e limitações do SQL
](connect-odbc-sql-support.md)
+ [

# Solução de problemas
](connect-odbc-troubleshooting.md)

## Começar
<a name="connect-odbc-get-started"></a>

**Etapa 1. Criar clusters do Amazon DocumentDB**  
Se você ainda não tem um cluster do Amazon DocumentDB, há várias maneiras de começar.  
O Amazon DocumentDB é uma nuvem privada virtual (VPC) apenas de serviço. Se você estiver se conectando a partir de uma máquina local fora da VPC do cluster, precisará criar uma conexão SSH com uma instância do Amazon EC2. Nesse caso, inicie seu cluster usando as instruções em [Conecte-se com EC2](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html). Consulte [Usar um túnel SSH para se conectar ao 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) para obter mais informações sobre tunelamento SSH e quando você precisar dele.

**Etapa 2. Instalação do JRE ou JDK**  
Dependendo da sua aplicação de BI, talvez seja necessário garantir uma instalação do JRE ou JDK de 64 bits, versão 8 ou posterior, instalada em seu computador. É possível fazer o download do Java SE Runtime Environment 8 [aqui](https://www.oracle.com/ca-en/java/technologies/downloads/#java8).

**Etapa 3. Faça o download do driver ODBC do Amazon DocumentDB**  
Faça o download do driver ODBC do Amazon DocumentDB [aqui.](https://github.com/aws/amazon-documentdb-odbc-driver/releases) Escolha o instalador adequado (por exemplo, documentdb-odbc-1.0.0.msi). Siga o guia de instalação.

**Etapa 4. Usar um túnel SSH para se conectar ao Amazon DocumentDB**  
Os clusters do Amazon DocumentDB são iniciados dentro de uma Amazon Virtual Private Cloud (Amazon VPC). Eles podem ser acessados diretamente por instâncias do Amazon EC2 ou outros serviços AWS que são implantados na mesma Amazon VPC. Além disso, o Amazon DocumentDB pode ser acessado por instâncias do Amazon EC2 ou outros serviços AWS em VPCs diferentes na mesma ou em outras regiões da AWS por meio do emparelhamento de VPC.  
No entanto, suponha que seu caso de uso exija que você (ou sua aplicação) acesse seus recursos do Amazon DocumentDB de fora da VPC do cluster. Esse será o caso da maioria dos usuários que não executam suas aplicações em uma VM na mesma VPC do cluster Amazon DocumentDB. Ao se conectar de fora da VPC, é possível usar o tunelamento SSH (também conhecido como encaminhamento de portas) para acessar seus recursos do Amazon DocumentDB.  
Para criar um túnel SSH, você precisa de uma instância do Amazon EC2 em execução na mesma Amazon VPC que seu cluster do Amazon DocumentDB. É possível usar uma instância do EC2 existente na mesma VPC que seu cluster ou criar uma instância. É possível configurar um túnel SSH para o cluster do Amazon DocumentDB `sample-cluster.node.us-east-1.docdb.amazonaws.com` ao executar o seguinte comando em seu computador local:  

```
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
```
O sinalizador `-L` é usado para encaminhar uma porta local. Esse é um pré-requisito para se conectar a qualquer ferramenta de BI em execução em um cliente fora da sua VPC. Depois de executar a etapa acima, é possível passar para as próximas etapas da ferramenta de BI de sua escolha.  
Para obter mais informações sobre o tunelamento SSH, consulte a documentação sobre [Como usar um túnel SSH para se conectar ao 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).

# Configurar o driver ODBC do Amazon DocumentDB no Windows
<a name="connect-odbc-setup-windows"></a>

Use o procedimento a seguir para configurar o driver ODBC do Amazon DocumentDB no Windows:

1. Abra o **Painel de Controle** no Windows e pesquise ODBC (ou, no menu, selecione **Ferramentas do Windows** > **Fontes de dados ODBC (32 bits)** ou **Fontes de dados ODBC (64 bits)**):  
![\[Interface do Painel de Controle do Windows mostrando os links de configuração para as fontes de dados de ODBC de 32 e 64 bits.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/odbc-control-panel-1.png)

1. Selecione o administrador da fonte de dados do driver ODBC apropriado: opte pela versão de 32 bits se ela estiver instalada; caso contrário, escolha a versão de 64 bits.

1. Selecione a guia DSN do sistema e clique em **Adicionar...** para adicionar um novo DSN:  
![\[Interface do administrador da fonte de dados de ODBC mostrando o botão Adicionar.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/odbc-add-dsn-1.png)

1. Escolha **Amazon DocumentDB** na lista de drivers da fonte de dados:  
![\[A interface Criar nova fonte de dados com a opção de driver Amazon DocumentDB foi selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/create-data-source-1.png)

1. Na caixa de diálogo **Configurar DSN do Amazon DocumentDB**, preencha os campos **Configurações da conexão**, a guia **TLS** e os campos **Testar conexão**, e clique em **Salvar**:  
![\[A interface Configurar DSN do Amazon DocumentDB com os campos Configurações de conexão, TLS e Testar conexão. O botão Salvar está na parte inferior.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/config-docdb-dsn-1.png)

1. Certifique-se de preencher o formulário do Windows com precisão, pois os detalhes da conexão serão diferentes dependendo do método de tunelamento SSH escolhido para a instância EC2. Veja os métodos de tunelamento SSH [aqui](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/setup.md#using-an-ssh-tunnel-to-connect-to-amazon-documentdb). Consulte [Sintaxe e opções da cadeia de conexão](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/connection-string.md) para obter mais informações sobre cada propriedade.  
![\[A interface Configurar DSN do Amazon DocumentDB com os campos Túnel SSH preenchidos.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/config-docdb-dsn-ssh-1.png)

Para obter mais informações sobre como configurar o driver ODBC do Amazon DocumentDB no Windows, clique [aqui](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/windows-dsn-configuration.md).

# Conecte-se ao Amazon DocumentDB a partir do Microsoft Excel
<a name="connect-odbc-excel"></a>

1. Certifique-se de que o driver do Amazon DocumentDB tenha sido instalado e configurado corretamente. Para obter informações adicionais, consulte [Configurar o driver ODBC no Windows](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-odbc-setup-windows.html).

1. Inicie o Microsoft Excel.

1. Navegue até **Dados** > **Obter dados** > **De outras fontes**.

1. Escolha **de ODBC**:  
![\[O menu suspenso Obter dados mostra o submenu De outras fontes. A opção De ODBC está selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/excel-odbc-1.png)

1. Selecione a fonte de dados no menu suspenso **Nome da fonte de dados (DSN)** associado ao Amazon DocumentDB:  
![\[O menu suspenso Nome da fonte de dados com a opção DSN do DocumentDB selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/excel-odbc-dsn-select-1.png)

1. Escolha a coleção da qual deseja carregar dados no Excel:  
![\[A interface do Navegador com a tabela de salários selecionada e uma prévia de seus dados.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/excel-odbc-collect-1.png)

1. Carregar dados no Excel:  
![\[Planilha do Excel mostrando cinco linhas de dados da tabela de salários selecionada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/excel-data-load-1.png)

# Conecte-se ao Amazon DocumentDB a partir do Microsoft Power BI Desktop
<a name="connect-odbc-power-bi"></a>

**Topics**
+ [

## Pré-requisitos
](#odbc-power-bi-prerequisites)
+ [

## Adicionar o conector personalizado do Microsoft Power BI Desktop
](#odbc-adding-power-bi)
+ [

## Conexão usando o conector personalizado do Amazon DocumentDB
](#odbc-connect-custom-connector)
+ [

## Configurar o Microsoft Power BI Gateway
](#odbc-power-bi-gw)

## Pré-requisitos
<a name="odbc-power-bi-prerequisites"></a>

Antes de começar, certifique-se de que o driver ODBC do Amazon DocumentDB esteja instalado corretamente.

## Adicionar o conector personalizado do Microsoft Power BI Desktop
<a name="odbc-adding-power-bi"></a>

Copie o arquivo `AmazonDocumentDBConnector.mez` para a pasta `<User>\Documents\Power BI Desktop\Custom Connectors\` (ou para `<User>\OneDrive\Documents\Power BI Desktop\Custom Connectors` se estiver usando o OneDrive). Isso permitirá que o Power BI acesse o conector personalizado. É possível obter o conector para o Power BI Desktop [aqui](https://github.com/aws/amazon-documentdb-odbc-driver/releases). Reinicie o Power BI Desktop para garantir que o conector esteja carregado.

**nota**  
O conector personalizado só oferece suporte ao nome de usuário e senha do Amazon DocumentDB para autenticação.

## Conexão usando o conector personalizado do Amazon DocumentDB
<a name="odbc-connect-custom-connector"></a>

1. Selecione Amazon DocumentDB (Beta) em **Obter dados** e clique em **Conectar**. Se você receber um aviso por usar um serviço de terceiros, clique em **Continuar**.  
![\[A opção da interface Obter dados com o Amazon DocumentDB (Beta) foi destacada.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/get-data-1.png)

1. Insira todas as informações necessárias para se conectar ao seu cluster Amazon DocumentDB e clique em **OK**:  
![\[Formulário com os campos de entrada de detalhes da conexão para um cluster do Amazon DocumentDB.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/docdb-form-1.png)
**nota**  
Dependendo da configuração do nome da fonte de dados (DSN) do driver ODBC, a tela de detalhes da conexão SSH pode não ser exibida se você já tiver fornecido as informações necessárias nas configurações do DSN.

1. Escolha o modo de conectividade de dados:
   + **Importar** - carrega todos os dados e armazena as informações no disco. Os dados devem ser atualizados e recarregados para mostrar as atualizações dos dados.
   + **Consulta direta** - não carrega dados, mas faz consultas em tempo real sobre os dados. Isso significa que os dados não precisam ser atualizados e recarregados para mostrar as atualizações de dados.  
![\[Interface mostrando as opções do modo de conectividade de dados para o DocumentDB.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/data-connectivity-1.png)
**nota**  
Se você estiver usando um conjunto de dados muito grande, a importação de todos os dados pode levar mais tempo.

1. Se for a primeira vez que você se conecta a essa fonte de dados, selecione o tipo de autenticação e insira suas credenciais quando solicitado. Depois, clique em **Conectar**:  
![\[Interface de autenticação mostrando os campos de entrada para as credenciais de nome de usuário e senha.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/docdb-credentials-1.png)

1. Na caixa de diálogo **Navegador**, selecione as tabelas do banco de dados desejadas e clique em **Carregar** para carregar os dados ou em **Transformar dados** para continuar transformando os dados.  
![\[Interface do navegador mostrando uma lista de tabelas de banco de dados para escolher. Os botões Carregar e Transformar Dados estão no canto inferior direito.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/navigator-1.png)
**nota**  
As configurações da fonte de dados são salvas quando você se conecta. Para modificá-las, selecione **Transformar dados** > **Configurações da fonte de dados**.

## Configurar o Microsoft Power BI Gateway
<a name="odbc-power-bi-gw"></a>

**Pré-requisitos**:
+ Verifique se o conector personalizado funcionará com o Power BI Gateway.
+ Verifique se o DSN ODBC foi criado nas fontes de dados ODBC na guia **Sistema** na máquina em que o Power BI Gateway está instalado.

Se você estiver usando o atributo de túnel SSH interno, o arquivo `known_hosts` precisará estar localizado onde a conta de serviço do Power BI tenha acesso a ele.

![\[A interface de propriedades known_hosts mostrando permissões para PBIEgwService.\]](http://docs.aws.amazon.com/pt_br/documentdb/latest/developerguide/images/ssh-known-hosts-1.png)


**nota**  
Isso também se aplica a qualquer arquivo que você possa precisar para estabelecer uma conexão com seu cluster Amazon DocumentDB, como um arquivo de certificado de autoridade de certificação (CA) (arquivo pem). 

# Geração automática de esquemas
<a name="connect-odbc-schema"></a>

O driver ODBC está utilizando o driver JDBC do Amazon DocumentDB por meio da JNI (Java Native Interface), fazendo com que o atributo de geração automática de esquemas funcione de forma semelhante no driver JDBC. Para obter mais informações sobre geração automática de esquemas, consulte Geração [automática de esquemas JDBC.](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-jdbc-autoschemagen.html) Além disso, para saber mais sobre a arquitetura do driver ODBC, clique [aqui](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/index.md).

# Suporte e limitações do SQL
<a name="connect-odbc-sql-support"></a>

O driver ODBC do Amazon DocumentDB é um driver somente para leitura que suporta um subconjunto do SQL-92 e algumas extensões comuns. Consulte a documentação de [suporte e limitações do ODBC](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/support/odbc-support-and-limitations.md) para obter mais informações.

# Solução de problemas
<a name="connect-odbc-troubleshooting"></a>

Se você estiver tendo problemas ao usar o driver ODBC do Amazon DocumentDB, consulte o [Guia de solução de problemas.](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/support/troubleshooting-guide.md)

# Programação com o Amazon DocumentDB
<a name="program-docdb"></a>

O serviço oferece suporte à validação do esquema JSON.

**Topics**
+ [Guia de programação em Java do DocumentDB](docdb-java-pg.md)
+ [

# Usando a validação do esquema JSON
](json-schema-validation.md)

# Guia de programação em Java do Amazon DocumentDB
<a name="docdb-java-pg"></a>

Este guia abrangente fornece instruções detalhadas para o trabalho com o Amazon DocumentDB usando os drivers de Java do MongoDB, abordando aspectos essenciais das operações e do gerenciamento do banco de dados.

**Topics**
+ [

## Introdução
](#java-pg-intro)
+ [

## Pré-requisitos
](#java-pg-prereqs)
+ [Modelos de dados](#java-pg-data-models)
+ [Conexão com um driver de Java](java-pg-connect-mongo-driver.md)
+ [Operações CRUD com Java](java-crud-operations.md)
+ [Gerenciamento de índices com Java](index-management-java.md)
+ [Programação orientada a eventos](event-driven-programming.md)

## Introdução
<a name="java-pg-intro"></a>

O guia começa com a conectividade, explicando como estabelecer conexões seguras com clusters do DocumentDB usando o driver de Java do MongoDB. Ele detalha os componentes da cadeia de conexão, a SSL/TLS implementação e várias opções de conexão, incluindo autenticação do IAM e agrupamento de conexões, além de estratégias robustas de tratamento de erros.

Na seção de operações CRUD (criar, ler, atualizar, excluir), o guia aborda detalhadamente a manipulação de documentos, demonstrando como criar, ler, atualizar e excluir documentos usando operações únicas e em massa. Ele explica o uso de filtros, consultas e várias opções de operação, ao mesmo tempo em que enfatiza as melhores práticas para tratamento de erros e implementação da lógica de repetição para melhorar a confiabilidade. O guia também aborda extensivamente o gerenciamento de índices, detalhando a criação e a manutenção de diferentes tipos de índice, incluindo índices de campo único, compostos, esparsos e de texto. Ele explica como otimizar a performance da consulta por meio da seleção adequada do índice e do uso da função `explain()` para analisar os planos de execução da consulta.

A seção final se concentra na programação orientada a eventos usando os fluxos de mudança do Amazon DocumentDB, demonstrando como implementar o monitoramento de alterações de dados em tempo real em aplicações de Java. Ele abrange a implementação de cursores de fluxo de mudança, o manuseio de tokens de retomada para operação contínua e operações baseadas em tempo para processamento de dados históricos. Ao longo do guia, exemplos práticos de código e práticas recomendadas são fornecidos, tornando-o um recurso inestimável para você na criação de aplicações robustas em Java com o Amazon DocumentDB.

## Pré-requisitos
<a name="java-pg-prereqs"></a>

Antes de começar, você deve ter o seguinte:
+ Uma AWS conta com um cluster DocumentDB configurado. Veja esta [postagem no blog de introdução](https://aws.amazon.com/blogs/database/part-1-getting-started-with-amazon-documentdb-using-amazon-ec2/) sobre a configuração do cluster de DocumentDB.
+ O Java Development Kit (JDK) instalado (usaremos o [Amazon Corretto 21](https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/downloads-list.html) para este guia).
+ Maven para o gerenciamento de dependências.

## Modelos de dados para este guia
<a name="java-pg-data-models"></a>

Todo o código de exemplo neste guia pressupõe uma conexão com um banco de dados de teste “ProgGuideData” que tem uma coleção “Restaurantes”. Todos os códigos de amostra neste guia funcionam em um sistema de listagem de restaurantes e, abaixo, há um exemplo da aparência de um documento nesse sistema:

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

Todas as amostras de código que mostram ações CRUD, gerenciamento de índices e programação orientada a eventos pressupõem que você tenha um objeto [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`, um objeto [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` e um objeto [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`.

**nota**  
Todos os exemplos de código neste guia foram testados com o driver de Java versão 5.3.0 do MongoDB.

# Conexão com o Amazon DocumentDB com um driver de Java do MongoDB
<a name="java-pg-connect-mongo-driver"></a>

Esta seção fornece um step-by-step guia para se conectar ao Amazon DocumentDB usando drivers Java. Isso fará com que você comece a integrar o DocumentDB às suas aplicações de Java.

**Topics**
+ [

## Etapa 1: configurar o projeto do
](#step1-set-up)
+ [

## Etapa 2: criação da string de conexão
](#step2-create-connection-string)
+ [

## Etapa 3: escrita do código de conexão
](#step3-write-connect-code)
+ [

## Etapa 4: tratamento de exceções de conexão
](#step4-handle-connect-exceptions)
+ [

## Etapa 5: execução do código
](#step5-running-code)
+ [

## Práticas recomendadas de conexão
](#java-connect-best-practices)

## Etapa 1: configurar o projeto do
<a name="step1-set-up"></a>

1. Usando o Maven, crie um projeto de java:

   ```
   mvn archetype:generate -DgroupId=com.docdb.guide -DartifactId=my-docdb-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
   ```

1. Adicione o driver de Java do MongoDB como uma dependência para o projeto em seu arquivo 'pom.xml':

   ```
   <dependency>
       <groupId>org.mongodb</groupId>
       <artifactId>mongodb-driver-sync</artifactId> 
       <version>5.3.0</version> 
   </dependency>
   ```

## Etapa 2: criação da string de conexão
<a name="step2-create-connection-string"></a>

A string de conexão do Amazon DocumentDB é essencial para estabelecer uma conexão entre sua aplicação e seu cluster do DocumentDB. Essa string encapsula informações cruciais, como o endpoint do cluster, a porta, os detalhes de autenticação e várias opções de conexão. Para criar uma string do DocumentDB, você normalmente começa com o formato básico:

```
"mongodb://username:password@cluster-endpoint:port/?[connection options]"
```

Você precisará substituir “nome de usuário” e “senha” por suas credenciais reais. Você pode encontrar o endpoint e o número da porta do seu cluster no Console de gerenciamento da AWS e por meio do AWS CLI. Consulte [Localizar os endpoints de um cluster](db-cluster-endpoints-find.md) para encontrar o endpoint de cluster para o seu cluster. A porta 27017 é a porta padrão para o DocumentDB.

**Exemplos de cadeias de conexão**
+ Estabelecimento de uma conexão com o DocumentDB usando criptografia em trânsito com garantia de que as solicitações de leitura sejam enviadas para réplicas de leitura e gravem no primário:

  ```
  "mongodb://username:password@cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false"
  ```
+ Estabelecimento de uma conexão com o DocumentDB usando a autenticação do IAM:

  ```
  "mongodb://cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false&
     authSource=%24external&
     authMechanism=MONGODB-AWS"
  ```

As diferentes opções disponíveis para a string de conexão são as seguintes:
+ [certificado TLS](#connection-string-tls)
+ [Leitura de réplicas de leitura](#connection-string-read-rep)
+ [Preocupação com a gravação e diário](#connection-string-write-journal)
+ [RetryWrites](#connection-string-retry-writes)
+ [Autenticação do IAM](#connection-string-iam-auth)
+ [Grupo de conexões](#connection-string-pool)
+ [Parâmetros de tempo limite da conexão](#connection-string-timeout)

### certificado TLS
<a name="connection-string-tls"></a>

**`tls=true|false`**: esta opção habilita ou desabilita o Transport Layer Security (TLS). Por padrão, a criptografia em trânsito está habilitada no cluster do Amazon DocumentDB e, portanto, a menos que o TLS esteja desabilitado no nível do cluster, o valor dessa opção deve ser `true`.

Ao usar o TLS, o código precisa fornecer um certificado SSL ao criar uma conexão com um cluster do DocumentDB. Baixe o certificado necessário para fazer a conexão segura com o cluster: [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem). Há duas formas de usar o arquivo `global-bundle.pem`.
+ **Opção 1**: extraia todos os certificados do arquivo `global-bundle.pem` e use a ferramenta de chave do Java para armazená-los em um arquivo `.jks` que possa ser usado posteriormente no código. Consulte a guia Java em [Conectar-se com o TLS habilitado](connect_programmatically.md#connect_programmatically-tls_enabled) para ver o script que mostra como fazer isso.
+ **Opção 2**: adicione dinamicamente o arquivo `global-bundle.pem` no código, crie um armazenamento de chaves na memória e use `SSLContext` para fornecer o certificado como parte da conexão.

### Leitura de réplicas de leitura
<a name="connection-string-read-rep"></a>

**`replicaSet=rs0&readPreference=secondaryPreferred`**: a especificação dessas duas opções encaminha todas as solicitações de leitura para as réplicas de leitura e as solicitações de gravação para a instância primária. O uso de `replicaSet=rs0` na string de conexão permite que o driver do MongoDB mantenha uma visão atualizada automaticamente da topologia do cluster, permitindo que as aplicações mantenham a visibilidade das configurações atuais dos nós à medida que as instâncias são adicionadas ou removidas. Não fornecer essas opções ou especificar `readPreference=primary` envia todas as leituras e gravações para a instância primária. Para obter mais opções para `readPreference`, consulte [Opções de preferência de leitura](how-it-works.md#durability-consistency-isolation).

### Preocupação com a gravação e diário
<a name="connection-string-write-journal"></a>

A preocupação com a gravação determina o nível de reconhecimento solicitado do banco de dados para operações de gravação. Os drivers do MongoDB oferecem uma opção para ajustar os arquivos de preocupação com a gravação e de diário. O Amazon DocumentDB não espera que você defina a preocupação com a gravação e o diário e ignora os valores enviados para `w` e `j` (`writeConcern` e `journal`). O DocumentDB sempre grava dados com `writeConcern`: `majority` e `journal`: `true` para que as gravações sejam realizadas de forma durável na maioria dos nós antes de enviar uma confirmação para o cliente.

### RetryWrites
<a name="connection-string-retry-writes"></a>

**`retryWrites=false`**: o DocumentDB não oferece suporte a gravações que possam ser repetidas e, portanto, esse atributo sempre deve ser definido como `false`.

### Autenticação do IAM
<a name="connection-string-iam-auth"></a>

**`authSource=%24external`e `authMechanism=MONGODB-AWS`** — Esses dois parâmetros são usados para autenticar usando AWS Identity and Access Management. A autenticação do IAM está disponível no momento somente na versão 5.0 do cluster baseado em instâncias. Para obter mais informações, consulte [Autenticação usando identidade do IAM](iam-identity-auth.md).

### Grupo de conexões
<a name="connection-string-pool"></a>

Essas opções estão disponíveis para agrupamento de conexões:
+ **`maxPoolSize`**: define o número máximo de conexões que podem ser criadas no grupo. Quando todas as conexões estão em uso e uma nova solicitação é recebida, ela espera que uma conexão fique disponível. O padrão para drivers de Java do MongoDB é 100.
+ **`minPoolSize`**: indica o número mínimo de conexões que devem ser mantidas no grupo o tempo todo. O padrão para drivers de Java do MongoDB é 0.
+ **`maxIdleTimeMS`**: determina por quanto tempo uma conexão pode permanecer inativa no grupo antes de ser fechada e removida. O padrão para drivers de Java do MongoDB é de 100 milissegundos.
+ **`waitQueueTimeoutMS`**: configura o tempo de espera de um thread para que uma conexão fique disponível quando o grupo estiver em seu tamanho máximo. Se uma conexão não ficar disponível dentro desse período, será lançada uma exceção. O valor padrão para drivers de Java do MongoDB é de 120.000 milissegundos (2 minutos).

### Parâmetros de tempo limite da conexão
<a name="connection-string-timeout"></a>

O tempo limite é um mecanismo para limitar a quantidade de tempo que uma operação ou tentativa de conexão pode levar até que seja considerada falha. Os parâmetros de tempo limite a seguir estão disponíveis para evitar esperas indefinidas e gerenciar a alocação de recursos:
+ **`connectTimeoutMS`**: configura o tempo de espera do driver para estabelecer uma conexão com o cluster. O padrão é 10.000 milissegundos (10 segundos).
+ **`socketTimeoutMS`**: especifica quanto tempo o driver aguardará por uma resposta do servidor para uma operação de não gravação. O padrão é de 0 (sem tempo limite ou infinito).
+ **`serverSelectionTimeoutMS`**: especifica quanto tempo o driver esperará para encontrar um servidor disponível no cluster. O valor padrão dessa configuração é de 30 segundos e é suficiente para que uma nova instância primária seja eleita durante o failover.

## Etapa 3: escrita do código de conexão
<a name="step3-write-connect-code"></a>

O exemplo de código a seguir mostra como fazer uma conexão de TLS com o Amazon DocumentDB:
+ Ele cria os objetos de 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) e [`SSLContext`>](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLContext.html).
+ Ele também cria o objeto [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) ao passá-lo para o objeto [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). Para fazer a conexão de TLS, você deve usar o objeto `MongoClientSettings` para vincular a `connectionstring` e o `sslcontext`.
+ O uso de [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) obtém um objeto [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);
    }
}
```

## Etapa 4: tratamento de exceções de conexão
<a name="step4-handle-connect-exceptions"></a>

Ao trabalhar com o DocumentDB em aplicações de Java, tratar exceções de conexão é crucial para manter operações de banco de dados robustas e confiáveis. Gerenciando adequadamente, essas exceções não apenas ajudam a diagnosticar problemas rapidamente, mas também garantem que sua aplicação possa tratar interrupções temporárias na rede ou indisponibilidade do servidor, melhorando a estabilidade e a experiência do usuário. Algumas das exceções críticas relacionadas ao estabelecimento de conexão incluem:
+ **`MongoException`**: uma exceção geral, pode ser emitida em vários cenários não cobertos por exceções mais específicas. Certifique-se de que essa exceção seja tratada após todas as outras exceções específicas, pois essa é uma exceção geral do MongoDB que captura tudo.
+ **`MongoTimeoutException`**: emitida quando uma operação expira. Por exemplo, ao consultar um endpoint de cluster inexistente.
+ **`MongoSocketException`**: emitida para problemas relacionados à rede. Por exemplo, em uma desconexão repentina da rede durante uma operação. 
+ **`MongoSecurityException`**: emitida quando a autenticação falha. Por exemplo, ao conectar-se com credenciais incorretas. 
+ **`MongoConfigurationException`**: emitida quando há um erro na configuração do cliente. Por exemplo, com o uso de uma string de conexão inválida.

## Etapa 5: execução do código
<a name="step5-running-code"></a>

O exemplo de código a seguir cria uma conexão do Amazon DocumentDB e imprime todos os bancos de dados:

```
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);
    }
}
```

## Práticas recomendadas de conexão
<a name="java-connect-best-practices"></a>

A seguir estão as práticas recomendadas a serem consideradas ao se conectar ao Amazon DocumentDB com um driver de Java do MongoDB:
+ Sempre feche o seu [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) quando não precisar mais que o cliente libere recursos.
+ Trate as exceções de forma adequada e implemente o log de erros adequado.
+ Use variáveis de ambiente ou AWS Secrets Manager para armazenar informações confidenciais, como nomes de usuário e senhas.

# Execução de operações CRUD no Amazon DocumentDB com Java
<a name="java-crud-operations"></a>

Esta seção discute a execução da operação CRUD (criar, ler, atualizar, excluir) no Amazon DocumentDB usando drivers de Java do MongoDB.

**Topics**
+ [

## Criação e inserção de documentos em uma coleção do DocumentDB
](#creating-inserting)
+ [

## Leitura e recuperação de dados de uma coleção do DocumentDB
](#reading-retrieving)
+ [

## Atualização de documentos existentes em uma coleção do DocumentDB
](#updating-documents)
+ [

## Remoção de documentos de uma coleção do DocumentDB
](#deleting-documents)
+ [

## Tratamento de erros com lógica de novas tentativas
](#error-handling)

## Criação e inserção de documentos em uma coleção do DocumentDB
<a name="creating-inserting"></a>

A inserção de documentos no Amazon DocumentDB permite que você adicione novos dados às suas coleções. Há várias maneiras de realizar inserções, dependendo das suas necessidades e do volume de dados com os quais você esteja trabalhando. O método mais básico para inserir um documento individual na coleção é `insertOne()`. Para inserir vários documentos ao mesmo tempo, é possível usar o método `insertMany()`, que permite adicionar uma matriz de documentos em uma única operação. Outro método para inserir muitos documentos em uma coleção do DocumentDB é o `bulkWrite()`. Neste guia, discutimos todos esses métodos para criar documentos em uma coleção do DocumentDB.

**`insertOne()`**

Vamos começar examinando como inserir um documento individual em uma coleção do Amazon DocumentDB. A inserção de um único documento é realizada usando o método `insertOne()`. Esse método usa a [BsonDocument](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/bson/org/bson/BsonDocument.html)para inserção e retorna um [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)objeto que pode ser usado para obter a ID do objeto do novo documento inserido. O código de exemplo abaixo mostra a inserção de um documento de restaurante na coleção:

```
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;
}
```

Ao usar `insertOne()`, certifique-se de incluir o tratamento adequado de erros. Por exemplo, no código acima, “`restaurantId`” tem um índice exclusivo e, portanto, executar esse código novamente gerará a `MongoWriteException` a seguir:

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

Os principais métodos usados para inserir muitos documentos em uma coleção são insertMany() e `bulkWrite()`. 

O método `insertMany()` é a maneira mais simples de inserir vários documentos em uma única operação. Ele aceita uma lista de documentos e os insere na coleção. Esse método é ideal quando você insere um lote de novos documentos que são independentes uns dos outros e não exigem nenhum processamento especial ou operações mistas. O código a seguir mostra a leitura de documentos JSON de um arquivo e a inserção deles na coleção. A `insertMany()` função retorna um [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`objeto que pode ser usado para obter todos os documentos inseridos. IDs 

```
// 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)**

O método `bulkWrite()` permite realizar várias operações de gravação (inserir, atualizar, excluir) em um único lote. É possível usar `bulkWrite()` quando precisar realizar diferentes tipos de operações em um único lote, como inserir alguns documentos e atualizar outros. `bulkWrite()` oferece suporte a dois tipos de gravação em lote, ordenada e não ordenada:
+ *Operações ordenadas*: (padrão) o Amazon DocumentDB processa as operações de gravação sequencialmente e para no primeiro erro encontrado. Isso é útil quando a ordem das operações é importante, como quando as operações posteriores dependem das anteriores. No entanto, as operações ordenadas geralmente são mais lentas do que as operações não ordenadas. Com as operações ordenadas, você deve resolver o caso em que o lote é interrompido no primeiro erro, potencialmente deixando algumas operações sem processamento.
+ *Operações não ordenadas*: permite que o Amazon DocumentDB processe inserções como uma única execução no banco de dados. Se ocorrer um erro com um documento, a operação continuará com os documentos restantes. Isso é particularmente útil quando você insere grandes quantidades de dados e pode tolerar algumas falhas, como durante a migração de dados ou importações em massa, em que alguns documentos podem falhar devido a chaves duplicadas. Com operações não ordenadas, você deve abordar cenários de sucesso parcial em que algumas operações obtêm êxito e outras falham.

Ao trabalhar com o método `bulkWrite()`, algumas classes essenciais são necessárias. Primeiro, a classe [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) serve como classe base para todas as operações de gravação e com implementações específicas como [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) e [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) tratando diferentes tipos de operações.

A [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)classe é necessária para configurar o comportamento de operações em massa, como definir a ordered/unordered execução ou ignorar a validação de documentos. A classe [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) fornece informações detalhadas sobre os resultados da execução, incluindo contagens de documentos inseridos, atualizados e excluídos.

Para o tratamento de erros, a classe [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) é crucial, pois contém informações sobre quaisquer falhas durante a operação em massa, enquanto a classe [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) fornece detalhes específicos sobre falhas de operação individuais. O código a seguir mostra um exemplo de inserção de uma lista de documentos, bem como atualização e exclusão de um único documento, tudo dentro da execução de uma única chamada ao método `bulkWrite()`. O código também mostra como trabalhar com [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) e [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), bem como o tratamento adequado de erros da operação `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());
}
```

**Gravações que podem ser repetidas**

Diferentemente do MongoDB, o Amazon DocumentDB não oferece suporte a gravações que possam ser repetidas. Como resultado, você deve implementar uma lógica de repetição personalizada em suas aplicações, especialmente para lidar com problemas de rede ou indisponibilidade temporária de serviços. Uma estratégia de repetição bem implementada geralmente envolve aumentar o atraso entre as tentativas e limitar o número total de tentativas. Consulte [Tratamento de erros com lógica de novas tentativas](#error-handling) abaixo para obter um exemplo de código de criação de lógica de repetição com tratamento de erros.

## Leitura e recuperação de dados de uma coleção do DocumentDB
<a name="reading-retrieving"></a>

A consulta de documentos no Amazon DocumentDB gira em torno de vários componentes principais que permitem recuperar e manipular dados com precisão. O [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())método é a consulta fundamental APIs nos drivers Java do MongoDB. Ele permite a recuperação de dados complexa com várias opções para filtrar, classificar e projetar resultados. Além do método `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) e [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) são dois outros componentes fundamentais que fornecem os blocos de construção para operações de consulta nos drivers de Java do MongoDB.

A classe `Filters` é uma classe utilitária no driver de Java do MongoDB que fornece uma API fluente para criar filtros de consulta. Essa classe oferece métodos estáticos de fábrica que criam instâncias de objetos `Bson` que representam várias condições de consulta. Os métodos mais usados incluem `eq()` para comparações de igualdade `gt()`, `lt()`, `gte()` e `lte()` para comparações numéricas, `and()` e `or()` para a combinação de várias condições, `in()` e `nin()` para testes de associação de matrizes e `regex()` para correspondência de padrões. A classe foi projetada para ser segura para tipos e fornece melhor verificação de tempo de compilação em comparação com consultas brutas baseadas em documentos, tornando-a a abordagem preferida para criar consultas DocumentDB em aplicações de Java. O tratamento de erros é robusto, com claras exceções lançadas para construções de filtro inválidas.

`FindIterable` é uma interface especializada projetada para lidar com o resultado do método `find()`. Ela fornece um rico conjunto de métodos para refinar e controlar a execução de consultas, oferecendo uma API fluente para o encadeamento de métodos. A interface inclui métodos essenciais de modificação de consultas, como `limit()` para a restrição do número de documentos retornados, `skip()` para paginação, `sort()` para ordenação de resultados, `projection()` para a seleção de campos específicos e `hint()` para a seleção de índices. As operações de lote, ignorar e limitar em `FindIterable` são ferramentas essenciais de paginação e gerenciamento de dados que ajudam a controlar como os documentos são recuperados e processados do banco de dados.

O agrupamento em lotes (`batchSize`) controla quantos documentos o DocumentDB retorna ao cliente em uma única viagem de ida e volta à rede. Quando você define um tamanho de lote, o DocumentDB não retorna todos os documentos correspondentes de uma só vez, mas os retorna em grupos do tamanho de lote especificado. 

Ignorar permite que você desvie o ponto de partida de seus resultados, basicamente dizendo ao DocumentDB que pule um número específico de documentos antes de começar a retornar as correspondências. Por exemplo, `skip(20)` ignorará os primeiros 20 documentos correspondentes. Isso é comumente usado em cenários de paginação em que você deseja recuperar páginas subsequentes de resultados. 

O limite restringe o número total de documentos que podem ser retornados de uma consulta. Quando você especifica `limit(n)`, o DocumentDB deixará de retornar documentos depois de retornar 'n' documentos, mesmo que haja mais correspondências no banco de dados. 

`FindIterable` oferece suporte a padrões de iterador e cursor ao recuperar documentos do Amazon DocumentDB. A vantagem de usar `FindIterable` como iterador é que ela permite o carregamento lento de documentos e só busca documentos quando solicitada pela aplicação. Outro benefício de usar o iterador é que você não é responsável por manter a conexão com o cluster e, portanto, nenhum fechamento explícito da conexão é necessário. 

`FindIterable` também fornece suporte ao [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), que permite que padrões de cursor sejam usados ao trabalhar com consultas do Amazon DocumentDB. O `MongoCursor` é uma implementação específica do driver de Java do MongoDB que fornece controle sobre as operações do banco de dados e o gerenciamento de recursos. Ele implementa a `AutoCloseable` interface, permitindo o gerenciamento explícito de recursos por meio de try-with-resources blocos, o que é crucial para fechar adequadamente as conexões do banco de dados e liberar recursos do servidor. Por padrão, o cursor expira em 10 minutos e o DocumentDB não oferece a opção de alterar esse comportamento de tempo limite. Ao trabalhar com dados em lote, certifique-se de recuperar o próximo lote de dados antes que o cursor atinja o tempo limite. Uma consideração importante ao usar o `MongoCursor` é que ele requer um fechamento explícito para evitar vazamentos de recursos.

Nesta seção, vários exemplos são apresentados para `find()`, `Filters` e `FindIterable`.

O exemplo de código a seguir mostra como usar `find()` para recuperar um único documento usando o campo “restaurantId”:

```
Document filter = new Document("restaurantId", "REST-21G145");
Document result = collection.find(filter).first();
```

Embora o uso de `Filters` permita uma melhor verificação de erros no tempo de compilação, o driver de java também permite que você especifique um filtro `Bson` diretamente no método `find()`. O código de exemplo a seguir passa o documento `Bson` para `find()`:

```
result = collection.find(new Document("$and", Arrays.asList(
    new Document("rating.totalReviews", new Document("$gt", 1000)),
    new Document("priceRange", "$$"))))
```

O código de exemplo a seguir mostra vários exemplos de uso da classe `Filters` com `find()`:

```
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));
```

O exemplo a seguir mostra como encadear as operações de `sort()`, `skip()`, `limit()` e `batchSize()` em um objeto `FindIterable`. A ordem de como essas operações são fornecidas influenciará a performance da sua consulta. Como prática recomendada, a ordem dessas operações deve ser `sort()`, `projection()`, `skip()`, `limit()` e `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);
```

O exemplo de código a seguir mostra como criar um iterador em `FindIterable`. Ele usa a construção `forEach` do Java para percorrer o conjunto de resultados.

```
collection.find(Filters.eq("cuisine", "American")).forEach(doc -> System.out.println(doc.toJson()));
```

No último exemplo de código de `find()`, ele mostra como usar `cursor()` para a recuperação de documentos. Ele cria o cursor no bloco try, o que garante que o cursor seja fechado quando o código sair do bloco try.

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

## Atualização de documentos existentes em uma coleção do DocumentDB
<a name="updating-documents"></a>

O Amazon DocumentDB fornece mecanismos flexíveis e poderosos para modificar documentos existentes e inserir novos quando eles não existam. O driver de Java do MongoDB oferece vários métodos para atualizações: `updateOne()` para atualizações de um único documento, `updateMany()` para atualizações de vários documentos e `replaceOne()` para a substituição completa de documentos. Além desses três métodos, [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) e [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) são outros componentes fundamentais que fornecem os blocos de construção para operações de atualização nos drivers de Java do MongoDB. 

A classe `Updates` no driver de Java do MongoDB é uma classe utilitária que fornece métodos estáticos de fábrica para criar operadores de atualização. Ela serve como o principal construtor para construir operações de atualização de maneira segura e legível. Métodos básicos como `set()`, `unset()`, e `inc()` permitem a modificação direta dos documentos. O poder dessa classe se torna evidente ao combinar várias operações usando o método `Updates.combine()`, que permite que várias operações de atualização sejam executadas atomicamente, garantindo a consistência de dados.

`UpdateOptions` é uma classe de configuração poderosa no driver de Java do MongoDB, que fornece recursos essenciais de personalização para operações de atualização de documentos. Dois aspectos importantes dessa classe são fornecer suporte a filtros upsert e de matriz para operações de atualização. O recurso upsert, ativado por meio de `upsert(true)`, permite a criação de novos documentos quando nenhum documento correspondente for encontrado durante uma operação de atualização. Por meio de `arrayFilters()`, a operação de atualização pode atualizar com precisão os elementos da matriz que atendem a critérios específicos.

`UpdateResult` no driver de Java do MongoDB, fornece o mecanismo de feedback detalhando o resultado de uma operação de atualização. Essa classe encapsula três métricas principais: o número de documentos correspondidos pelos critérios de atualização (`matchedCount`), o número de documentos realmente modificados (`modifiedCount`) e informações sobre quaisquer documentos que sofreram upsert (`upsertedId`). Compreender essas métricas é essencial para o tratamento adequado de erros, a verificação das operações de atualização e a manutenção da consistência de dados nas aplicações.

### Atualização e substituição de um único documento
<a name="update-single-doc"></a>

No DocumentDB, a atualização de um único documento pode ser realizada usando o método updateOne(). Esse método usa um parâmetro de filtro, geralmente fornecido pela classe `Filters`, para identificar o documento a ser atualizado, um parâmetro `Updat`e que determina quais campos devem ser atualizados e um parâmetro `UpdateOptions` opcional para definir opções diferentes para a atualização. O uso do método `updateOne()` atualizará somente o primeiro documento que corresponda aos critérios de seleção. O código de exemplo a seguir atualiza um único campo de um documento:

```
collection.updateOne(Filters.eq("restaurantId", "REST-Y2E9H5"),
    Updates.set("name", "Amazing Japanese sushi"));
```

Para atualizar vários campos em um documento, use `updateOne()` com `Update.combine()` conforme mostrado no exemplo a seguir. O exemplo também mostra como adicionar um item a uma matriz no documento.

```
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);
```

O exemplo de código a seguir demonstra como atualizar um documento no banco de dados. Se o documento especificado não existir, a operação o inserirá automaticamente como um novo documento. Esse código também mostra como usar as métricas disponíveis por meio do objeto `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)");
}
```

O exemplo de código a seguir demonstra como substituir completamente um documento existente por um novo usando o método `replaceOne()`, em vez de atualizar campos individuais. O método `replaceOne()` sobrescreve o documento inteiro, preservando somente o campo `_id` do original. Se vários documentos corresponderem aos critérios do filtro, somente o primeiro documento encontrado será substituído.

```
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());
```

### Atualização de vários documentos
<a name="update-multiple-docs"></a>

Há duas maneiras de atualizar vários documentos em uma coleção simultaneamente. É possível usar o método `updateMany()` ou usar [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) com o método `bulkWrite()`. O método `updateMany()` usa um parâmetro de filtro para selecionar documentos para atualização, o parâmetro `Update` para identificar os campos a serem atualizados e um parâmetro `UpdateOptions` opcional para especificar as opções de atualização.

O exemplo de código a seguir demonstra o uso do método `updateMany()`:

```
Bson filter = Filters.and(
    Filters.in("features", Arrays.asList("Private Dining")),
    Filters.eq("cuisine", "Thai"));
UpdateResult result1 = collection.updateMany(filter, Updates.set("priceRange", "$$$"));
```

O exemplo de código a seguir demonstra o método `bulkWrite()` usando a mesma atualização:

```
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());
```

## Remoção de documentos de uma coleção do DocumentDB
<a name="deleting-documents"></a>

O driver de Java do MongoDB oferece `deleteOne()` para a remoção de um único documento e `deleteMany()` para a remoção de vários documentos que correspondam a critérios específicos. Assim como a atualização, a operação de exclusão também pode ser usada com o método `bulkWrite()`. Tanto `deleteOne()` quanto `deleteMany()` retornam um objeto [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) que fornece informações sobre o resultado da operação, incluindo a contagem de documentos excluídos. A seguir há um exemplo de uso de `deleteMany()` para a remoção de vários documentos:

```
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());
```

## Tratamento de erros com lógica de novas tentativas
<a name="error-handling"></a>

Uma estratégia robusta de tratamento de erros para o Amazon DocumentDB deve implementar a categorização dos erros em passíveis de nova tentativa (como tempos limite de rede, problemas de conexão) e não passíveis de nova tentativa (como falhas de autenticação, consultas inválidas). Para falhas de operação devido a erros que devem ter nova tentativa, ele deve implementar um intervalo de tempo entre cada nova tentativa, bem como o máximo de tentativas de repetição. As operações CRUD devem estar em um bloco try-catch que capture [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) e suas subclasses. Além disso, ele deve incluir monitoramento e registro de erros para visibilidade operacional. Veja a seguir um exemplo de código que mostra como implementar o tratamento de erros com nova tentativa:

```
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);
    }
}
```

# Gerenciamento de índices no Amazon DocumentDB com Java
<a name="index-management-java"></a>

Os índices permitem a recuperação eficiente de dados de uma coleção do Amazon DocumentDB. Sem índices, o DocumentDB deve digitalizar todos os documentos da coleção para retornar resultados que satisfaçam uma determinada consulta. Este tópico fornece informações sobre como criar, eliminar e listar índices usando os drivers de Java do MongoDB. Ele também discute como determinar se um índice específico está sendo usado na consulta e como dar dicas ao Amazon DocumentDB para usar um índice específico.

**Topics**
+ [Criar índices](#creating-indexes)
+ [Reduzir índices](#dropping-indes)
+ [Determinação da seleção do índice e fornecimento de dicas de índice](#w2aac43b9b7c17c13)

O Amazon DocumentDB oferece suporte a vários tipos de índices. Para obter uma visão geral abrangente de todos os índices com suporte, consulte esta [postagem do blog](https://aws.amazon.com/blogs/database/how-to-index-on-amazon-documentdb-with-mongodb-compatibility/). 

## Criação de índices com Java
<a name="creating-indexes"></a>

Há dois mecanismos para criar índices no Amazon DocumentDB usando drivers de Java do MongoDB: por meio de `runCommand()` e pelo método `createIndex()` para um único índice ou pelo método `createIndexes()` para vários índices. Um motivo para usar os métodos `createIndex()` e `createIndexes()` é que é possível criar um melhor tratamento de erros detectando erros específicos relacionados à criação do índice. Outro motivo para usar esses métodos em vez de `runCommand()` é que o driver de Java do MongDB fornece um rico conjunto de classes de suporte para criação e manipulação de índices. Observe que essas classes de suporte só poderão ser usadas quando você estiver usando os métodos `createIndex()` ou `createIndexes()`. Há três classes de apoio:
+ **[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)**: esta classe serve como uma classe utilitária que oferece métodos estáticos de fábrica para criar vários tipos de índices. Ela simplifica o processo de criação de definições de índice complexas e é comumente usada em conjunto com outras classes relacionadas a índices.
+ **[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)**: esta é uma classe fundamental que encapsula a definição das chaves de índice e suas opções. Ela representa uma especificação completa do índice, combinando o que indexar (as chaves) com a forma de indexar (as opções). Essa classe é particularmente útil ao criar vários índices simultaneamente, pois permite definir uma coleção de especificações de índice que podem ser passadas para o método `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)**: esta é uma classe de configuração abrangente que fornece um rico conjunto de métodos para personalizar o comportamento do índice. Ela inclui configurações para índices exclusivos, índices esparsos, tempo de expiração (TTL) e expressões de filtro parcial. Por meio do encadeamento de métodos, é possível configurar várias opções, como a criação de índice em segundo plano e restrições exclusivas.

**Criação de um índice único**

Este exemplo mostra como criar um índice único usando o método `createIndex(` em segundo plano. Para entender a criação de índices em segundo plano e em primeiro plano, consulte [Tipos de criação de índice](managing-indexes.md#index-build-types). O exemplo de código a seguir usa [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) para criar um índice exclusivo com o nome “unique\$1restaurantId\$1idx” em segundo plano. Esse objeto `IndexOptions` é então passado ao método `createIndex()`.

```
collection.createIndex(
    Indexes.ascending("restaurantId"),
    new IndexOptions()
        .unique(true)
        .name("unique_restaurantId_idx")
        .background(true));
```

**Criação de vários índices**

Este exemplo cria vários índices usando o método `createIndexes()`. Primeiro, ele cria a opção para cada índice usando o objeto [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) e, em seguida, passa uma lista de objetos `IndexModel` para o método `createIndexes()`. O exemplo de código a seguir mostra como criar um índice composto usando a classe de utilitários [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). Essa classe também é usada para especificar se você deseja criar um índice usando a ordem de classificação crescente ou decrescente. Depois de criar vários índices, ele verifica a criação do índice chamando o método `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()));
```

**Criação de índices esparsos e parciais**

Este exemplo mostra a criação de um índice esparso e um parcial com a criação de um [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) para cada tipo de índice.

```
// 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))));
```

**Criação de um índice de texto**

Este exemplo mostra como criar e excluir um índice de texto. Somente um índice de texto é permitido em uma coleção, mas esse índice de texto pode ser um índice composto cobrindo vários campos. Ao usar vários campos no índice de texto, você também pode atribuir pesos a cada um dos campos no índice. Não há suporte para os índices de texto em campos de matriz no Amazon DocumentDB e, embora você possa usar até 30 campos no índice de texto composto, somente três campos podem receber um peso.

```
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());
```

**Criação de um índice por meio de `runCommand()`**

O Amazon DocumentDB oferece suporte à criação de índices paralelos para diminuir o tempo necessário para criar índices. A indexação paralela usa vários trabalhadores simultâneos. Os trabalhadores padrão usados para a criação do índice são dois. Esta [postagem do blog](https://aws.amazon.com/blogs/database/unlock-the-power-of-parallel-indexing-in-amazon-documentdb/) fornece uma discussão aprofundada sobre indexação paralela. Atualmente, os drivers de Java do MongDB não oferecem suporte à especificação da opção do trabalhador quando você estiver usando `createIndex()` ou `createIndexes()` e, portanto, a única maneira de especificar trabalhadores é por meio de `runCommand`. O exemplo de código a seguir demonstra como usar `runCommand` para criar um índice que aumente o trabalhador para quatro:

```
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);
```

## Reduzir índices
<a name="dropping-indes"></a>

O driver de Java do MongoDB fornece vários métodos para eliminar índices, atendendo a diferentes cenários e às suas preferências. É possível eliminar índices por nome, por especificação de chave ou eliminar todos os índices de uma só vez. Os métodos `dropIndex()` e `dropIndexes()` podem ser invocados em um objeto de coleção para eliminar um índice. Ao descartar um índice pelo nome, você deverá garantir que eles usem o nome correto, o que nem sempre é intuitivo, especialmente para índices compostos ou gerados automaticamente. A tentativa de eliminar um índice inexistente resultará em uma [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). O índice `default _id` não pode ser descartado, pois garante a exclusividade do documento na coleção.

O exemplo de código a seguir mostra como eliminar um índice fornecendo o nome do campo em que o índice foi criado ou excluindo todos os índices: 

```
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();
```

Ao descartar índices usando várias chaves, verifique se há um índice composto contendo todas as chaves especificadas e se a ordem das chaves está correta. O código de exemplo de criação de índice acima mostra uma chave composta sobre “culinária” e recursos. Se você tentar eliminar essa chave composta, mas a ordem não for a usada para a criação, ocorrerá um MongoCommnadException erro da seguinte forma:

```
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);
}
```

O seguinte erro é exibido:

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

## Determinação da seleção do índice e fornecimento de dicas de índice
<a name="w2aac43b9b7c17c13"></a>

O trabalho com a funcionalidade de explicação no Amazon DocumentDB é fundamental para que você entenda a performance das consultas e o uso de índices. Ao executar uma consulta, é possível acrescentar o método `explain()` para obter informações detalhadas sobre o plano da consulta, incluindo quais índices, se houver, estão sendo usados. O resultado `explain()` fornece informações sobre os estágios de execução da consulta, o número de documentos examinados e o tempo gasto em cada estágio. Essas informações são inestimáveis para identificar se um determinado índice está sendo usado de forma eficaz ou se a consulta pode se beneficiar de uma estrutura de índices diferente.

O método `explain()` pode ser encadeado com o método `find()`. O método `explain()` pode usar uma enumeração [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) opcional que determina o nível de verbosidade retornado por `explain()`. No momento, há suporte somente aos enumeradores `EXECUTION_STATS` e `QUERY_PLANNER` no DocumentDB. O exemplo de código a seguir mostra como obter um planejador de consultas para uma consulta específica:

```
// 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());
```

O documento JSON a seguir é retornado para o nível de verbosidade do planejador de consultas:

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

Você tem várias opções para influenciar ou forçar o Amazon DocumentDB a usar um índice específico. Os métodos `hint()` e `hintString()` permitem que você substitua o comportamento padrão de seleção de índice do otimizador de consultas especificando explicitamente qual índice deve ser usado para uma consulta. Embora o otimizador de consultas do DocumentDB geralmente faça boas escolhas para a seleção de índices, há cenários em que forçar a aprovação de um índice específico por meio de `hint()` ou `hintString()` pode ser benéfico, como ao lidar com dados distorcidos ou ao testar a performance do índice.

O exemplo de código a seguir força o uso do índice composto “cuisine\$1features\$1idx” para a mesma consulta que foi executada no código acima:

```
// 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));
```

# Programação orientada a eventos com Amazon DocumentDB e Java
<a name="event-driven-programming"></a>

A programação orientada a eventos no contexto do Amazon DocumentDB representa um poderoso padrão arquitetônico em que as alterações no banco de dados servem como os principais geradores de eventos que acionam a lógica e os processos comerciais subsequentes. Quando os registros são inseridos, atualizados ou excluídos em uma coleção do DocumentDB, essas alterações agem como eventos que iniciam automaticamente vários processos posteriores, notificações ou tarefas de sincronização de dados. Esse padrão é particularmente valioso em sistemas distribuídos modernos, nos quais várias aplicações ou serviços precisam reagir às mudanças de dados em tempo real. O principal mecanismo de implementação da programação orientada a eventos no DocumentDB é por meio de fluxos de alterações.

**nota**  
Este guia pressupõe que você tenha habilitado fluxos de alterações em uma coleção com a qual você esteja trabalhando. Consulte [Usar fluxos de alterações com o Amazon DocumentDB](change_streams.md) para saber como habilitar fluxos de alterações na coleção. 

**Trabalho com fluxos de alterações da aplicação em Java**

O método `watch()` no driver de Java do MongoDB é o principal mecanismo para monitorar alterações de dados em tempo real no Amazon DocumentDB. O método `watch()` pode ser chamado por objetos [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)) e [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()).

O método `watch()` retorna uma instância de [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)) que oferece suporte a várias opções de configuração, incluindo pesquisa completa de documentos para atualizações, fornecimento de tokens de retomada e registro de data e hora para fins de confiabilidade e estágios de agregação de pipeline para filtrar alterações. 

[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)) implementa a interface Java principal `Iterable` e pode ser usada com`forEach()`. Para capturar eventos usando `forEach()`, passe uma função de retorno de chamada para `forEach()` que processe o evento alterado. O trecho de código a seguir mostra como abrir um fluxo de alterações em uma coleção para iniciar o monitoramento de eventos de alteração:

```
ChangeStreamIterable < Document > iterator = collection.watch();
iterator.forEach(event - > {
    System.out.println("Received a change: " + event);
});
```

Outra forma de percorrer todos os eventos de mudança é abrir um cursor que mantenha uma conexão com o cluster e receba continuamente novos eventos de alteração à medida que eles ocorram. Para obter um cursor de fluxos de alterações, use o método `cursor()` do objeto [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)). O exemplo de código a seguir mostra como monitorar eventos de alteração usando o cursor:

```
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) {
    System.out.println(cursor.tryNext());
}
```

Como prática recomendada, crie o [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())em uma try-with-resource instrução ou feche manualmente o cursor. Chamar o método `cursor()` em [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)) retornará um `MongoChangeStreamCursor` que é criado sobre um objeto [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). 

A classe [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) é um componente crucial que representa eventos de mudança individuais no fluxo. Ela contém informações detalhadas sobre cada modificação, incluindo o tipo de operação (inserir, atualizar, excluir, substituir), a chave do documento, as informações do namespace e o conteúdo completo do documento, quando disponível. A classe fornece métodos para acessar vários aspectos do evento de alteração, como `getOperationType()` para determinar o tipo de alteração, `getFullDocument()` para acessar o estado completo do documento e `getDocumentKey()` para identificar o documento modificado.

O objeto [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) fornece duas informações importantes, um token de retomada e a hora do evento de mudança.

Os tokens de retomada e as operações baseadas em tempo nos fluxos de alterações do DocumentDB fornecem mecanismos cruciais para manter a continuidade e gerenciar o acesso histórico aos dados. Um token de retomada é um identificador exclusivo gerado para cada evento de alteração, servindo como um marcador que permite que as aplicações reiniciem o processamento do fluxo de alterações a partir de um ponto específico após desconexões ou falhas. Quando um cursor de fluxo de alterações é criado, ele pode usar um token de retomada armazenado anteriormente por meio da opção `resumeAfter()`, permitindo que o fluxo continue de onde parou, em vez de começar do início ou perder eventos.

As operações baseadas em tempo nos fluxos de alterações oferecem diferentes abordagens para gerenciar o ponto de partida do monitoramento de eventos de mudança. A opção `startAtOperationTime()` permite que você comece a observar as alterações que ocorreram em ou após um carimbo de data e hora específico. Esses recursos baseados em tempo são particularmente valiosos em cenários que exigem processamento, point-in-time recuperação ou sincronização de dados históricos entre sistemas.

O exemplo de código a seguir recupera o evento associado ao documento inserido, captura seu token de retomada e, em seguida, fornece esse token para iniciar o monitoramento de eventos após o evento de inserção. O evento é associado ao evento de atualização e, em seguida, obtém a hora do cluster em que a atualização aconteceu e usa esse carimbo de data/hora como ponto de partida para processamento adicional.

```
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());
  }
```

Por padrão, o evento de atualização de alteração não inclui o documento completo, apenas as alterações que foram feitas. Se você precisar acessar o documento completo que foi atualizado, é possível chamar o método `fullDocument()` no objeto [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)). Lembre-se de que, quando você solicita a devolução de um documento completo para um evento de atualização, ele retorna o documento que existe no momento em que a chamada para alterar fluxos é feita.

Esse método usa uma enumeração [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) como parâmetro. No momento, o Amazon DocumentDB só oferece suporte a DEFAULT e a valores `UPDATE_LOOKUP`. O trecho de código a seguir mostra como solicitar o documento completo para eventos de atualização ao começar a observar as alterações:

```
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().fullDocument(FullDocument.UPDATE_LOOKUP).cursor())
```

# Usando a validação do esquema JSON
<a name="json-schema-validation"></a>

Usando o operador de consulta de avaliação `$jsonSchema`, você pode validar documentos que estão sendo inseridos em suas coleções.

**Topics**
+ [

## Criação e uso da validação do esquema JSON
](#get-started-with-validation)
+ [

## Palavras-chave com suporte
](#json-supported-keywords)
+ [

## bypassDocumentValidation
](#json-schema-bypass)
+ [

## Limitações
](#json-schema-limitations)

## Criação e uso da validação do esquema JSON
<a name="get-started-with-validation"></a>

### Criação de uma coleção com validação de esquema
<a name="create-collection-with-validation"></a>

Você pode criar uma coleção com regras de operação e validação do `createCollection`. Essas regras de validação são aplicadas durante inserções ou atualizações de documentos do Amazon DocumentDB. O exemplo de código a seguir mostra as regras de validação para uma coleção de funcionários:

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

### Inserindo um documento válido
<a name="insert-valid-document"></a>

O exemplo a seguir insere documentos que estão em conformidade com as regras de validação de esquema acima:

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

### Inserindo um documento inválido
<a name="insert-invalid-document"></a>

O exemplo a seguir insere documentos que não estão em conformidade com as regras de validação de esquema acima. Neste exemplo, o valor do EmployeeID não é uma string:

```
db.employees.insert({
    "name" : { "firstName" : "Carol" , "lastName" : "Smith"}, 
    "employeeId": 720 , 
    "salary": 1000.0 
})
```

Este exemplo mostra a sintaxe incorreta no documento.

### Modifica uma coleção.
<a name="modify-collection"></a>

O comando `collMod` é usado para adicionar ou modificar as regras de validação da coleção existente. O exemplo a seguir adiciona um campo de salário à lista de campos obrigatórios:

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

### Documentos de endereçamento adicionados antes da alteração das regras de validação
<a name="pre-validation-docs"></a>

Para endereçar documentos que foram adicionados à sua coleção antes da alteração das regras de validação, use os seguintes modificadores `validationLevel`:
+ **estrito**: aplica regras de validação em todas as inserções e atualizações.
+ **moderado**: aplica regras de validação a documentos válidos existentes. Durante as atualizações, os documentos inválidos existentes não são verificados.

No exemplo a seguir, depois de atualizar as regras de validação na coleção chamada “funcionários”, o campo salário é obrigatório. A atualização do seguinte documento falhará:

```
db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }] 
})
```

O Amazon DocumentDB retorna a seguinte saída:

```
{
"n" : 0,
    "nModified" : 0,
    "writeErrors" : [
        {
"index" : 0,
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

Atualizar o nível de validação para `moderate` permitirá que o documento acima seja atualizado com sucesso:

```
db.runCommand({
    "collMod" : "employees", 
    validationLevel : "moderate"
})

db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }]
})
```

O Amazon DocumentDB retorna a seguinte saída:

```
{
"n" : 1,
    "nModified" : 1,
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

### Recuperando documentos com o \$1jsonSchema
<a name="json-retrieve-docs"></a>

O operador `$jsonSchema` pode ser usado como filtro para consultar documentos que correspondam ao esquema JSON. Esse é um operador de nível superior que pode estar presente em documentos de filtro como um campo de nível superior ou usado com operadores de consulta, como `$and`, `$or` e `$nor`. Os exemplos a seguir mostram o uso de \$1jsonSchema como um filtro individual e com outros operadores de filtro:

Documento inserido em uma coleção de “funcionários”:

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

Coleção filtrada somente com o operador `$jsonSchema`:

```
db.employees.find({ 
       $jsonSchema: { required: ["age"] } })
```

O Amazon DocumentDB retorna a seguinte saída:

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

Coleção filtrada com o operador `$jsonSchema` e outro operador:

```
db.employees.find({ 
       $or: [{ $jsonSchema: { required: ["age", "name"]}}, 
            { salary: { $lte:1000}}]});
```

O Amazon DocumentDB retorna a seguinte saída:

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

Coleção filtrada com o operador `$jsonSchema` e com o `$match` no filtro agregado:

```
db.employees.aggregate(
    [{ $match: { 
        $jsonSchema: { 
            required: ["name", "employeeId"],  
            properties: {"salary" :{"bsonType": "double"}}
        }
       }
    }]
)
```

O Amazon DocumentDB retorna a seguinte saída:

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

### Visualizando as regras de validação existentes
<a name="view-validation-rules"></a>

Para ver as regras de validação existentes em uma coleção, use:

```
db.runCommand({
    listCollections: 1, 
    filter: { name: 'employees' }
})
```

O Amazon DocumentDB retorna a seguinte saída:

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

O Amazon DocumentDB também mantém as regras de validação no estágio de agregação de `$out`.

## Palavras-chave com suporte
<a name="json-supported-keywords"></a>

Os seguintes campos são compatíveis com os comandos `create` e `collMod`:
+ **`Validator`** — Oferece suporte ao operador `$jsonSchem`.
+ **`ValidationLevel`** — Oferece suporte aos valores `off`, `strict` e `moderate`.
+ **`ValidationAction`** — Oferece suporte ao valor `error`.

O operador \$1jsonSchema é compatível com as seguintes palavras-chave:
+ `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>

O Amazon DocumentDB oferece suporte a `bypassDocumentValidation` para os seguintes comandos e métodos:
+ `insert`
+ `update`
+ `findAndModify`
+ Estágio `$out` no comando `aggregate` e no método `db.collection.aggregate()`

O Amazon DocumentDB não oferece suporte aos seguintes comandos para `bypassDocumentValidation`: 
+ `$merge` no comando `aggregate` e no método `db.collection.aggregate()`
+ Comando `mapReduce` e método `db.collection.mapReduce()`
+ Comando `applyOps`

## Limitações
<a name="json-schema-limitations"></a>

As limitações a seguir se aplicam à validação `$jsonSchema`:
+ O Amazon DocumentDB retorna o erro “Falha na validação do documento” quando uma operação falha na regra de validação.
+ Os clusters elásticos do Amazon DocumentDB não suportam `$jsonSchema`.