

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Desarrollo de Amazon DocumentDB
<a name="documentdb-development"></a>

En estas secciones se explica la implementación mediante Amazon DocumentDB.

**Topics**
+ [Conexión a DocumentDB](connect-docdb.md)
+ [Programación con DocumentDB](program-docdb.md)

# Conexión a Amazon DocumentDB
<a name="connect-docdb"></a>

Amazon DocumentDB ofrece varias opciones de conexión, incluidas las conexiones programáticas mediante controladores MongoDB, la conexión desde fuera de una VPC mediante túneles SSH o una VPN de AWS, y herramientas populares como Studio 3T y DataGrip. El servicio admite conexiones de conjuntos de réplicas para una alta disponibilidad. Para el análisis y la elaboración de informes, puede conectarse mediante controladores JDBC u ODBC. Las instancias de EC2 de la misma VPC pueden conectarse directamente a los clústeres de DocumentDB. Todas las conexiones requieren TLS y credenciales/autenticación de AWS adecuadas.

**Topics**
+ [Conexión mediante programación](connect_programmatically.md)
+ [Conexión desde fuera de una Amazon VPC](connect-from-outside-a-vpc.md)
+ [Conexión como conjunto de réplicas](connect-to-replica-set.md)
+ [Conexión mediante Studio 3T](studio3t.md)
+ [Conexión mediante DataGrip](data-grip-connect.md)
+ [Conectarse mediante Amazon EC2](connect-ec2.md)
+ [Conexión mediante el controlador JDBC](connect-jdbc.md)
+ [Conexión mediante el controlador ODBC](connect-odbc.md)

# Conexión mediante programación a Amazon DocumentDB
<a name="connect_programmatically"></a>

En esta sección, se incluyen ejemplos de código que demuestran cómo conectarse a Amazon DocumentDB (con compatibilidad con MongoDB) utilizando diferentes lenguajes. Los ejemplos se dividen en dos secciones en función de si se conecta a un clúster que tiene habilitado o deshabilitado Transport Layer Security (TLS). De manera predeterminada, TLS está habilitado para los nuevos clústeres de Amazon DocumentDB. Sin embargo, puede desactivar TLS si lo desea. Para obtener más información, consulte [Cifrado de datos en tránsito](security.encryption.ssl.md). 

Si intenta conectarse a su Amazon DocumentDB desde fuera de la VPC en la que reside el clúster, consulte [Conexión a un clúster de Amazon DocumentDB desde fuera de una Amazon VPC](connect-from-outside-a-vpc.md). 

Antes de conectarse a su clúster, debe saber si TLS está habilitado en él. En la siguiente sección, se muestra cómo determinar el valor del parámetro `tls` del clúster mediante la Consola de administración de AWS o la AWS CLI. A continuación, puede buscar y aplicar el ejemplo de código adecuado.

**Topics**
+ [Determinación del valor del parámetro `tls`](#connect_programmatically-determine_tls_value)
+ [Conexión con TLS habilitado](#connect_programmatically-tls_enabled)
+ [Conexión con TLS deshabilitado](#connect_programmatically-tls_disabled)

## Determinación del valor del parámetro `tls`
<a name="connect_programmatically-determine_tls_value"></a>

Para determinar si el clúster tiene habilitado TLS, hay que seguir un proceso de dos pasos que puede realizar mediante la Consola de administración de AWS o la AWS CLI.

1. **Determine qué grupo de parámetros rige el clúster.**

------
#### [ Using the Consola de administración de AWS ]

   1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon DocumentDB en [https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb).

   1. En el panel de navegación izquierdo, elija **Clusters (Clústeres)**.

   1. En la lista de clústeres, seleccione el nombre del clúster.

   1. La página resultante muestra los detalles del clúster seleccionado. Seleccione la pestaña **Configuración**. En la sección **Configuraciones y estado**, busque el nombre del grupo de parámetros debajo del **Grupo de parámetros del clúster**.

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

   El siguiente código de la AWS CLI determina qué parámetro rige el clúster. Asegúrese de reemplazar *`sample-cluster`* por el nombre del clúster.

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

   La salida de esta operación será similar a lo que se indica a continuación:

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

------

1. **Determine el valor del parámetro `tls` en el grupo de parámetros del clúster.**

------
#### [ Using the Consola de administración de AWS ]

   1. En el panel de navegación, seleccione **Grupos de parámetros**.

   1. En la ventana **Grupos de parámetros del clúster**, seleccione el nombre del grupo de parámetros del clúster del Paso 1d.

   1. En la página resultante se muestran los parámetros del grupo de parámetros del clúster. Puede ver el valor del parámetro `tls` aquí. Para obtener información sobre la modificación de este parámetro, consulte [Modificación de grupos de parámetros de clúster de Amazon DocumentDB](cluster_parameter_groups-modify.md).

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

   Puede utilizar el comando de la `describe-db-cluster-parameters` AWS CLI para ver los detalles de los parámetros del grupo de parámetros del clúster.
   + **`--describe-db-cluster-parameters`** — para obtener una lista de los parámetros de un grupo de parámetros, junto con sus valores.
     + **`--db-cluster-parameter-group name`** — obligatorio. El nombre del grupo de parámetros del clúster.

   En los siguientes ejemplos, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

   La salida de esta operación será similar a lo que se indica a continuación: 

   ```
   {
           "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**  
Amazon DocumentDB admite los puntos de conexión FIPS 140-3 a partir de los clústeres con Amazon DocumentDB 5.0 (versión del motor 3.0.3727) en las siguientes regiones: ca-central-1, us-west-2, us-east-1, us-east-2, us-gov-east-1, us-gov-west-1.

------

Después de determinar el valor del parámetro `tls`, continúe conectándose al clúster utilizando uno de los ejemplos de código que se muestran en las siguientes secciones.
+ [Conexión con TLS habilitado](#connect_programmatically-tls_enabled) 
+ [Conexión con TLS deshabilitado](#connect_programmatically-tls_disabled) 

## Conexión con TLS habilitado
<a name="connect_programmatically-tls_enabled"></a>

Para ver un ejemplo de código para conectarse mediante programación a un clúster de Amazon DocumentDB con TLS habilitado, elija la pestaña adecuada al lenguaje que desea utilizar.

Para cifrar datos en tránsito, descargue la clave pública para Amazon DocumentDB denominada `global-bundle.pem` mediante la siguiente operación.

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

Si l aplicación está en Microsoft Windows y requiere un archivo PKCS7, puede descargar el paquete de certificados PKCS7. Este paquete contiene los certificados intermedio y raíz en [ https://truststore.pki.rds.amazonaws.com/global/global-bundle.p7b](https://truststore.pki.rds.amazonaws.com/global/global-bundle.p7b).

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Python cuando TLS está habilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Node.js cuando TLS está habilitado.

**importante**  
Existe una limitación conocida con los controladores de Node.js anteriores a la versión 6.13.1, ya que Amazon DocumentDB no los admite actualmente para la autenticación de identidad de IAM. Los controladores y las herramientas de Node.js que utilizan el controlador Node.js (por ejemplo, mongosh) deben actualizarse para utilizar el controlador Node.js, versión 6.13.1 o posterior.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando PHP cuando TLS está habilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Go cuando TLS está habilitado.

**nota**  
A partir de la versión 1.2.1, el controlador de MongoDB Go solo utilizará el primer certificado de servidor de CA que se encuentre en `sslcertificateauthorityfile`. El siguiente código de ejemplo corrige esta limitación anexando manualmente todos los certificados de servidor que se encuentran en `sslcertificateauthorityfile` a una configuración TLS personalizada utilizada durante la creación del cliente. 

En los siguientes ejemplos, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

Si se conecta a un clúster de Amazon DocumentDB con TLS habilitado desde una aplicación Java, el programa debe utilizar el archivo de la entidad de certificación (CA) proporcionado por AWS para validar la conexión. Para utilizar el certificado de CA de Amazon RDS, haga lo siguiente:

1. Descargue el archivo de CA de Amazon RDS desde [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) .

1. Cree un almacén de confianza con el certificado de CA contenido en el archivo utilizando los siguientes comandos. Asegúrese de cambiar *truststore-password* por otra cosa. Si tiene acceso a un almacén de confianza que contiene el certificado de CA antiguo (`rds-ca-2015-root.pem`) y el nuevo certificado de CA (`rds-ca-2019-root.pem`), puede importar el grupo de certificados en el almacén de confianza. 

   A continuación se muestra un ejemplo de script de shell que importa el paquete de certificados a un almacén de confianza en un sistema operativo Linux. En los ejemplos siguientes, reemplace cada *marcador de posición del usuario* con su propia información. En particular, siempre que se encuentre el directorio de ejemplo “*mydir*” en el script, sustitúyalo por un directorio que haya creado para esta tarea.

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

   A continuación se muestra un ejemplo de script de shell que importa el paquete de certificados a un almacén de confianza en 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. Utilice el `keystore` de su programa estableciendo las siguientes propiedades del sistema en la aplicación antes de establecer una conexión con el clúster de Amazon DocumentDB.

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

1. El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Java cuando TLS está habilitado.

   En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando C\$1 / .NET cuando TLS está habilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El siguiente código demuestra cómo conectarse a Amazon DocumentDB y realizar consultas mediante la versión más reciente, mongosh, o la versión anterior del shell de mongo cuando TLS está habilitado.

**Conexión con Amazon DocumentDB con mongosh**

**importante**  
Existe una limitación conocida con los controladores de Node.js anteriores a la versión 6.13.1, ya que Amazon DocumentDB no los admite actualmente para la autenticación de identidad de IAM. Los controladores y las herramientas de Node.js que utilizan el controlador Node.js (por ejemplo, mongosh) deben actualizarse para utilizar el controlador Node.js, versión 6.13.1 o posterior.

En los siguientes ejemplos, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

**Conexión con Amazon DocumentDB con la versión anterior del shell de mongo**

Si usa IAM, debe usar una versión anterior del shell de mongo. Introduzca una de las siguientes opciones de comando:

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

Si utiliza una versión igual o superior a la 4.2, utilice el siguiente código para conectarse. Amazon DocumentDB no admite el reintento de las escrituras. Si utiliza el shell de mongo heredado (no mongosh), no incluya el comando `retryWrites=false` en ninguna cadena de código. El reintento de las escrituras está desactivado de forma predeterminada. Incluir `retryWrites=false` podría provocar un error en comandos de lectura normales.

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

**Pruebe la conexión**

1. Insertar un documento.

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

1. Busque el documento que ha insertado anteriormente.

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

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

En el siguiente código, se muestra cómo conectarse a Amazon DocumentDB con R usando mongolite ([https://jeroen.github.io/mongolite/](https://jeroen.github.io/mongolite/)) cuando TLS está habilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB con Ruby cuando TLS está habilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

------

## Conexión con TLS deshabilitado
<a name="connect_programmatically-tls_disabled"></a>

Para ver un ejemplo de código para conectarse mediante programación a un clúster de Amazon DocumentDB con TLS deshabilitado, elija la pestaña del lenguaje que desea utilizar.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Python cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Node.js cuando TLS está deshabilitado.

**importante**  
Existe una limitación conocida con los controladores de Node.js anteriores a la versión 6.13.1, ya que Amazon DocumentDB no los admite actualmente para la autenticación de identidad de IAM. Los controladores y las herramientas de Node.js que utilizan el controlador Node.js (por ejemplo, mongosh) deben actualizarse para utilizar el controlador Node.js, versión 6.13.1 o posterior.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando PHP cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Go cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando Java cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB utilizando C\$1 / .NET cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El siguiente código demuestra cómo conectarse a Amazon DocumentDB y realizar consultas mediante la versión más reciente, mongosh, o la versión anterior del shell de mongo cuando TLS está deshabilitado.

**Conexión con Amazon DocumentDB con mongosh**

**importante**  
Existe una limitación conocida con los controladores de Node.js anteriores a la versión 6.13.1, ya que Amazon DocumentDB no los admite actualmente para la autenticación de identidad de IAM. Los controladores y las herramientas de Node.js que utilizan el controlador Node.js (por ejemplo, mongosh) deben actualizarse para utilizar el controlador Node.js, versión 6.13.1 o posterior.

En los siguientes ejemplos, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

**Conexión con Amazon DocumentDB con la versión anterior del shell de mongo**

Si usa IAM, debe usar una versión anterior del shell de mongo. Introduzca una de las siguientes opciones de comando:

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

Si utiliza una versión igual o superior a la 4.2, utilice el siguiente código para conectarse. Amazon DocumentDB no admite el reintento de las escrituras. Si utiliza el shell de mongo heredado (no mongosh), no incluya el comando `retryWrites=false` en ninguna cadena de código. El reintento de las escrituras está desactivado de forma predeterminada. Incluir `retryWrites=false` podría provocar un error en comandos de lectura normales.

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

**Pruebe la conexión**

1. Insertar un documento.

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

1. Busque el documento que ha insertado anteriormente.

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

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

En el siguiente código, se muestra cómo conectarse a Amazon DocumentDB con R usando mongolite ([https://jeroen.github.io/mongolite/](https://jeroen.github.io/mongolite/)) cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

El código siguiente demuestra cómo conectarse a Amazon DocumentDB con Ruby cuando TLS está deshabilitado.

En el siguiente ejemplo, reemplace cada *marcador de posición del usuario* con la información de su clúster.

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

------

# Conexión a un clúster de Amazon DocumentDB desde fuera de una Amazon VPC
<a name="connect-from-outside-a-vpc"></a>

Los clústeres de Amazon DocumentDB (con compatibilidad con MongoDB) se implementan en una instancia de Amazon Virtual Private Cloud (Amazon VPC). Se puede obtener acceso a ellos directamente mediante instancias de Amazon EC2 u otros servicios de AWS que se implementen en la misma Amazon VPC. Además, es posible obtener acceso a Amazon DocumentDB mediante instancias EC2 u otros servicios de AWS en diferentes VPC de la misma región de Región de AWS u otras regiones a través de la interconexión de VPC.

Sin embargo, supongamos que su caso de uso requiere que usted o su aplicación tengan acceso a los recursos de Amazon DocumentDB desde fuera de la VPC del clúster. En ese caso, puede utilizar la tunelización SSH (denominada también *reenvío de puertos*) para obtener acceso a sus recursos de Amazon DocumentDB. 

La descripción detallada de la tunelización SSH queda fuera del alcance de este tema. Si desea obtener más información sobre la tunelización SSH, consulte los siguientes temas:
+ [Túnel SSH](https://www.ssh.com/ssh/tunneling/) 
+ [SSH Port Forwarding Example](https://www.ssh.com/ssh/tunneling/example), en concreto la sección [ Local Forwarding](https://www.ssh.com/ssh/tunneling/example#sec-Local-Forwarding)

Para crear un túnel SSH, necesita una instancia de Amazon EC2 que se ejecute en la misma VPC de Amazon que el clúster de Amazon DocumentDB. Puede usar una instancia EC2 existente en la misma VPC que el clúster o crear una. Para obtener más información, consulte el tema correspondiente a su sistema operativo:
+ [Introducción a las instancias Linux de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)
+ [Introducción a las instancias de Windows de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html)

Es posible que normalmente se conecte a una instancia EC2 con el siguiente comando:

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

Si es así, puede configurar un túnel de SSH en el clúster de Amazon DocumentDB `sample-cluster.node.us-east-1.docdb.amazonaws.com` ejecutando el siguiente comando en el equipo local. La marca `-L` se utiliza para el reenvío de un puerto local. Cuando utilice un túnel SSH, es recomendable que se conecte al clúster utilizando el punto de conexión de dicho clúster y que no intente conectarse utilizando el modo de conjunto de réplicas (es decir, especificando `replicaSet=rs0` en la cadena de conexión), ya que dará lugar a un error.

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

Una vez creado el túnel SSH, cualquier comando que envíe a `localhost:27017` se reenvía al clúster de Amazon DocumentDB `sample-cluster` que se ejecuta en la VPC de Amazon. Si la seguridad de la capa de transporte (TLS) está habilitada en el clúster de Amazon DocumentDB, tiene que descargar la clave pública de Amazon DocumentDB desde [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem) . La siguiente operación descarga este archivo:

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

**nota**  
TLS está habilitado de forma predeterminada para los nuevos clústeres de Amazon DocumentDB. No obstante, sí puede deshabilitarlo. Para obtener más información, consulte [Administración de la configuración de TLS del clúster de Amazon DocumentDB](security.encryption.ssl.md#security.encryption.ssl.managing). 

Para conectarse a su clúster de Amazon DocumentDB desde fuera de Amazon VPC, utilice el comando siguiente.

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

# Conexión a Amazon DocumentDB como conjunto de réplicas
<a name="connect-to-replica-set"></a>

Cuando desarrolle en Amazon DocumentDB (con compatibilidad con MongoDB), recomendamos que se conecte al clúster como conjunto de réplicas y distribuya las lecturas a las instancias de réplica mediante las funciones integradas de preferencias de lectura del controlador. En esta sección se profundiza en lo que esto significa y se describe cómo conectarse al clúster de Amazon DocumentDB como conjunto de réplicas con el SDK para Python como ejemplo.

Amazon DocumentDB tiene tres puntos de conexión que puede utilizar para conectarse al clúster:
+ Punto de conexión de clúster
+ Punto de conexión del lector
+ Puntos de conexión de instancia

En la mayoría de los casos, cuando se conecte a Amazon DocumentDB, recomendamos que utilice el punto de conexión de clúster. Se trata de un CNAME que apunta a la instancia principal del clúster, tal y como se muestra en el siguiente diagrama.

Cuando utilice un túnel SSH, es recomendable que se conecte al clúster utilizando el punto de conexión de dicho clúster y que no intente conectarse utilizando el modo de conjunto de réplicas (es decir, especificando `replicaSet=rs0` en la cadena de conexión), ya que dará lugar a un error.

**nota**  
Para obtener más información acerca de los puntos de conexión de sitio web de Amazon DocumentDB, consulte [Puntos de conexión de Amazon DocumentDB](how-it-works.md#how-it-works.endpoints).

![\[Diagrama que muestra los puntos de conexión Amazon DocumentDB, incluidos los puntos de conexión de clúster, lector e instancia.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/docdb-endpoint-types.png)


Con el punto de conexión de clúster, puede conectarse al clúster en modo de conjunto de réplicas. A continuación, puede utilizar las funciones integradas del controlador de preferencias de lectura. En el siguiente ejemplo, al especificar `/?replicaSet=rs0`, el SDK entiende que desea conectarse como conjunto de réplicas. Si omite `/?replicaSet=rs0'`, el cliente dirige todas las solicitudes al punto de conexión de clúster, es decir, la instancia 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')
```

La ventaja de conectarse como conjunto de réplicas es que permite al SDK detectar automáticamente la topografía del clúster, lo que incluye cuándo se añaden o se eliminan instancias del clúster. Posteriormente, puede utilizar el clúster de forma más eficiente dirigiendo las solicitudes de lectura a las instancias de réplica.

Cuando se conecta como conjunto de réplicas, puede especificar la `readPreference` para la conexión. Si especifica una preferencia de lectura de `secondaryPreferred`, el cliente dirige las consultas de lectura a las réplicas y las consultas de escritura, a la instancia principal (como en el siguiente diagrama). Así, se aprovechan mejor los recursos del clúster. Para obtener más información, consulte [Opciones de preferencia de lectura](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 que muestra readPreference de Amazon DocumentDB: secondaryPreferred.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/docdb-readPreference-secondaryPreferred.png)


Las lecturas de las réplicas de Amazon DocumentDB presentan consistencia final. Devuelven los datos en el mismo orden en que se escribieron en la instancia principal y, a menudo, hay un retardo de replicación inferior a 50 ms. Puede monitorizar el retardo de réplica del clúster con las métricas de Amazon CloudWatch `DBInstanceReplicaLag` y `DBClusterReplicaLagMaximum`. Para obtener más información, consulte [Supervisión de Amazon DocumentDB con CloudWatch](cloud_watch.md).

A diferencia de la arquitectura monolítica tradicional de las bases de datos, Amazon DocumentDB separa el almacenamiento y la computación. Dada esta arquitectura moderna, le animamos a escalar la lectura en las instancias de réplica. Las lecturas en las instancias de réplica no bloquean la replicación de las escrituras desde la instancia principal. Puede añadir hasta 15 instancias de réplica de lectura en un clúster y escalar a millones de lecturas por segundo.

La ventaja principal de conectarse como conjunto de réplicas y distribuir las lecturas a las réplicas es que aumenta los recursos generales del clúster disponibles para utilizar la aplicación. Recomendamos que se conecte como conjunto de réplicas como práctica recomendada. Además, lo recomendamos con más frecuencia en las siguientes situaciones:
+ Si utiliza casi el 100 % de la CPU en la instancia principal.
+ Si la proporción de aciertos de la caché del búfer es casi cero.
+ Si alcanza los límites de conexión o cursor de una instancia.

Escalar el tamaño de una instancia de clúster es una opción y, en algunos casos, puede ser la mejor manera de escalar el clúster. Sin embargo, también deberá plantearse cómo aprovechar mejor las réplicas que ya tiene en el clúster. Esto le permite aumentar la escala sin el mayor coste de utilizar un tipo de instancia mayor. También recomendamos que monitorice y alerte de estos límites (es decir, `CPUUtilization`, `DatabaseConnections` y `BufferCacheHitRatio`) mediante las alarmas de CloudWatch para saber cuándo se está utilizando mucho un recurso. 

Para obtener más información, consulte los temas siguientes:
+ [Prácticas recomendadas para Amazon DocumentDB](best_practices.md)
+ [Cuotas y límites de Amazon DocumentDB](limits.md)

## Uso de las conexiones del clúster
<a name="connect-to-replica-set.utilizing-cluster-connections"></a>

Plantéese la posibilidad de utilizar todas las conexiones del clúster. Por ejemplo, una instancia `r5.2xlarge` tiene un límite de 4500 conexiones (y 450 cursores abiertos). Si crea un clúster de Amazon DocumentDB de tres instancias y se conecta únicamente a la instancia principal mediante el punto de conexión de clúster, los límites de conexiones y cursores abiertos del clúster son de 4500 y 450 respectivamente. Podría alcanzar estos límites al crear aplicaciones que utilizan muchos procesos de trabajo que se ponen en marcha en contenedores. Los contenedores abren una serie de conexiones a la vez y saturan el clúster.

En su lugar, podría conectarse al clúster de Amazon DocumentDB como conjunto de réplicas y distribuir las lecturas a las instancias de réplica. A continuación, podría triplicar de forma eficaz el número de conexiones y cursores disponibles en el clúster a 13 500 y 1350 respectivamente. Añadir más instancias al clúster solo aumenta el número de conexiones y cursores para las cargas de trabajo de lectura. Si necesita aumentar el número de conexiones para las escrituras en el clúster, recomendamos que aumente el tamaño de la instancia.

**nota**  
El número de conexiones para las instancias `large`, `xlarge` y `2xlarge` aumenta con el tamaño de instancia hasta 4500. El número máximo de conexiones por instancia para instancias `4xlarge` o superiores es 4500. Para obtener más información sobre los límites por tipos de instancia, consulte [Límites de instancias](limits.md#limits.instance).

Normalmente, no recomendamos que se conecte al clúster con la preferencia de lectura de `secondary`. Esto se debe a que, si no hay instancias de réplica en el clúster, las lecturas generarán un error. Por ejemplo, suponga que tiene un clúster de Amazon DocumentDB de dos instancias con una instancia principal y una réplica. Si la réplica tiene un problema, se generará un error en las solicitudes de lectura de un grupo de conexiones establecido como `secondary`. La ventaja de `secondaryPreferred` es que, si el cliente no encuentra una instancia de réplica adecuada a la que conectarse, recurre a la instancia principal para las lecturas.

## Varios grupos de conexiones
<a name="connect-to-replica-set.multiple-connection-pools"></a>

En algunos casos, las lecturas de una aplicación deben contar con consistencia de lectura tras escritura, que solo se puede distribuir desde la instancia principal en Amazon DocumentDB. En estos casos, podría crear dos grupos de conexiones del cliente: uno para escrituras y otro para lecturas que necesiten consistencia de lectura tras escritura. Para ello, el código tendría un aspecto similar al siguiente.

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

Otra opción consiste en crear un único grupo de conexiones y sobrescribir la preferencia de lectura en una colección determinada.

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

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

Para aprovechar mejor los recursos del clúster, recomendamos que se conecte al clúster mediante el modo de conjunto de réplicas. Si es adecuado para la aplicación, puede escalar la lectura de la aplicación distribuyendo las lecturas a las instancias de réplica.

# Conexión a un clúster de Amazon DocumentDB desde Studio 3T
<a name="studio3t"></a>

[Studio 3T](https://studio3t.com/) es una GUI e IDE popular para desarrolladores e ingenieros de datos que trabajan con MongoDB. Ofrece varias funciones potentes: vistas de sus datos en árbol, tabla y JSON, sencillas import/export en CSV, JSON, SQL y BSON/MongoDump, una opción de consulta flexible, una drag-and-drop interfaz de usuario visual, un shell mongo integrado con autocompletado, un editor de canalizaciones de agregación y soporte para consultas SQL.

## Requisitos previos
<a name="prerequisites"></a>
+ Si aún no tiene un clúster de Amazon DocumentDB que utilice Amazon EC2 como bastion/jump host, siga las instrucciones sobre cómo [Conectarse con Amazon](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html) EC2.
+ Si no tiene Studio 3T, [descárguelo e instálelo](https://studio3t.com/download). 

## Conexión con Studio 3T
<a name="connect-studio3t"></a>

1. Seleccione **Conectar** en la esquina superior izquierda de la barra de herramientas.  
![\[Interfaz Studio 3T, en la que se muestra la pantalla de bienvenida y la opción Conectar resaltadas en la esquina superior izquierda.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-connect.png)

1. Seleccione **Nueva conexión** en la esquina superior izquierda de la barra de herramientas.  
![\[Interfaz del Administrador de conexión con la opción Nueva conexión resaltada en la esquina superior izquierda.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-newconn.png)

1. En la pestaña **Servidor**, en el campo **Servidor**, introduzca la información del punto de conexión del clúster.  
![\[Pestaña Servidor de la interfaz Conexión nueva con el campo de entrada Servidor resaltado.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-endpoint.png)
**nota**  
¿No encuentra el punto de conexión de su clúster? Solo tiene que seguir los pasos que se indican [aquí](https://docs.aws.amazon.com/documentdb/latest/developerguide/db-instance-endpoint-find.html).

1. Elija la pestaña **Autenticación** y seleccione **Heredado** en el menú desplegable **Modo de autenticación**.  
![\[Pestaña Autenticación de la interfaz Conexión nueva con el modo de autenticación anterior seleccionado y la información de nombre de usuario, contraseña y base de datos de autenticación proporcionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-auth.png)

1. Introduzca su nombre de usuario y sus credenciales en los campos **Nombre de usuario** y **Contraseña**.

1. Seleccione la pestaña **SSL** y marque la casilla **Usar el protocolo SSL para conectarse**.  
![\[Pestaña SSL de la interfaz Conexión nueva con la opción Usar protocolo SSL para conectarse seleccionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-ssl.png)

1. Seleccione **Usar un archivo CA raíz propio**. A continuación, añada el certificado de Amazon DocumentDB (puede omitir este paso si SSL está deshabilitado en su clúster de DocumentDB). Marque la casilla para permitir **nombres de host no válidos**.  
![\[Pestaña SSL de la interfaz Conexión nueva con el archivo CA raíz ingresado y permitir nombres de host no válidos seleccionado.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-ssl.png)
**nota**  
¿No tiene el certificado? Puede descargarlo con el siguiente comando:  
 `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem ` 

1. Si se conecta desde una máquina cliente externa a Amazon VPC, debe crear un túnel SSH. Hará esto en la pestaña **SSH**.

   1. Marque la casilla **Usar túnel SSH** e introduzca la dirección SSH en el campo **Dirección SSH**. Esta es su instancia Public DNS (). IPV4 Puede obtener esta URL desde su [Consola de administración de Amazon EC2](https://console.aws.amazon.com/ec2).

   1. Introduzca su nombre de usuario. Este es el nombre de usuario de su instancia de Amazon EC2. 

   1. Como **Modo de autenticación SSH**, seleccione **Clave privada**. En el campo **Clave privada**, elija el icono del buscador de archivos para localizar y elegir la clave privada de su instancia de Amazon EC2. Este es el archivo .pem (par de claves) que guardó al crear la instancia en la consola de Amazon EC2.

   1. Si estás en una máquina Linux/macOS cliente, es posible que tengas que cambiar los permisos de tu clave privada mediante el siguiente comando:

      `chmod 400 /fullPathToYourPemFile/<yourKey>.pem`  
![\[Pestaña SSH de la interfaz Conexión nueva con las credenciales del túnel SSH introducidas.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-ssh.png)
**nota**  
Esta instancia de Amazon EC2 debe estar en la misma VPC de Amazon y grupo de seguridad que el clúster de DocumentDB. Puede obtener la dirección SSH, el nombre de usuario y la clave privada en su [Consola de administración de Amazon EC2](https://console.aws.amazon.com/ec2).

1. Ahora pruebe la configuración pulsando el botón **Probar conexión**.  
![\[Interfaz Conexión nueva con el botón Probar conexión resaltado en la esquina inferior izquierda.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-testbutton.png)

1. Una ventana de diagnóstico debería cargar una barra verde para indicar que la prueba se ha realizado correctamente. Ahora pulse **Aceptar** para cerrar la ventana de diagnóstico.  
![\[Ventana de diagnóstico que aparece después de una prueba de conexión correcta.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-testconn.png)

1. Elija **Guardar** para guardar la conexión y usarla en el futuro.  
![\[Interfaz Conexión nueva con el botón Guardar resaltado.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-save.png)

1. Ahora seleccione su clúster y elija **Conectar**.  
![\[Interfaz Conexión nueva con el botón Conectar resaltado.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/studio3t/studio3t-finalconnect.png)

¡Enhorabuena\$1 Se ha conectado correctamente a su clúster de Amazon DocumentDB a través de Studio 3T.

# Conexión a Amazon DocumentDB mediante DataGrip
<a name="data-grip-connect"></a>

[DataGrip](https://www.jetbrains.com/help/datagrip/documentdb.html) es un potente entorno de desarrollo integrado (IDE) que admite varios sistemas de bases de datos, incluido Amazon DocumentDB. En esta sección se explican los pasos para conectarse a su clúster de Amazon DocumentDB mediante DataGrip, lo que le permite administrar y consultar sus datos fácilmente mediante una interfaz gráfica.

## Requisitos previos
<a name="data-grip-prerequisites"></a>
+ El IDE de DataGrip está instalado en su máquina. Puede descargarlo desde [JetBrains](https://www.jetbrains.com/datagrip/download/#section=windows).
+ Una instancia de Amazon EC2 que se ejecute en la misma VPC que el clúster de Amazon DocumentDB. Utilizará esta instancia para establecer un túnel seguro desde su máquina local hasta el clúster de Amazon DocumentDBCluster. Siga estas instrucciones sobre cómo [Conectarse mediante Amazon EC2](connect-ec2.md):
+ Como alternativa a una instancia Amazon EC2, a una conexión VPN o si ya está accediendo a su infraestructura de AWS mediante una VPN segura. Si prefiere esta opción, siga las instrucciones para [acceder de forma segura a Amazon DocumentDB mediante AWS Client VPN](https://aws.amazon.com/blogs/database/securely-access-amazon-documentdb-with-mongodb-compatibility-locally-using-aws-client-vpn/).

## Conexión mediante DataGrip
<a name="data-grip-connect-steps"></a>

1. Inicie DataGrip en su ordenador y cree un **Nuevo proyecto**.  
![\[Pantalla de bienvenida de DataGrip con la opción Nuevo proyecto resaltada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/welcome.png)

1. Agregue un nuevo origen de datos de una de las siguientes formas:

   1. En el menú principal, vaya a **Archivo — Nuevo — Origen de datos** y seleccione **DocumentDB**

   1. En el **explorador de bases de datos**, haga clic en el nuevo icono (**\$1**) de la barra de herramientas. Vaya al **origen de datos** y seleccione **DocumentDB**.  
![\[La lista desplegable de + muestra el submenú Origen de datos. DocumentDB se selecciona en ese submenú.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/explorer.png)

1. En la página **Orígenes de datos** de la pestaña **General**, compruebe si hay un enlace para **descargar los archivos del controlador que faltan** en la parte inferior del área de configuración de la conexión. Haga clic en este enlace para descargar los controladores necesarios para interactuar con una base de datos. Para obtener un enlace de descarga directa, consulte los [controladores JDBC de JetBrains](https://www.jetbrains.com/datagrip/jdbc-drivers/).  
![\[La interfaz de Orígenes de datos y controladores con el enlace Descargar los archivos de controladores que faltan resaltado.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/missing-driver.png)

1. En la pestaña **General**, especifique los detalles de la conexión:

   1. En el campo **Host**, especifique el punto de conexión del clúster de Amazon DocumentDB.

   1. **El puerto** ya está establecido en 27017. Cámbielo si el clúster se implementó en un puerto diferente.

   1. En **Autenticación**, elija **Nombre de usuario y contraseña**.

   1. Introduzca la información de nombre de usuario y contraseña.

   1. El campo **Base de datos** es opcional. Puede especificar la base de datos a la que desea conectarse.

   1. El campo **URL** se completa automáticamente a medida que añade los detalles anteriores.  
![\[Los campos de host, puerto, autenticación, base de datos y URL se encuentran en la pestaña General de la interfaz de Orígenes de datos y controladores.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/connection.png)

1. En la pestaña **SSH/SSL**, habilite **Usar túnel SSH** y, a continuación, haga clic en el icono para abrir el cuadro de diálogo **Configuración de SSH**. Introduzca la información siguiente:

   1. En el campo **Host**, introduzca el nombre de host de su instancia de Amazon EC2.

   1. Introduzca el nombre de usuario y la contraseña de la instancia de Amazon EC2.

   1. En **Tipo de autenticación**, elija **Par de claves**.

   1. Introduzca su **Archivo de clave privada**.
**nota**  
Si utiliza la opción VPN, no es necesario configurar el túnel SSH.  
![\[La pestaña SSH/SSL de la interfaz de Orígenes de datos y controladores con la opción Usar túnel SSH seleccionada y el icono de configuración de SSH resaltado. El icono abre la interfaz de Configuraciones de SSH que se muestra.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ssh-tunnel.png)

1. En la pestaña **SSH/SSL**, habilite **Usar SSL**. En el campo **Archivo CA**, introduzca la ubicación del archivo `global-bundle.pem` en su ordenador. En **Modo**, deje la opción **Requerir**.
**nota**  
Puede descargar el certificado desde esta ubicación o con este comando: wget [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem)
**nota**  
Si se está conectando al clúster elástico de Amazon DocumentDB, no tiene que especificar el archivo CA. Deje marcada la opción **Usar SSL** y todas las demás opciones con sus valores predeterminados.  
![\[La pestaña SSH/SSL de la interfaz de Orígenes de datos y controladores tiene habilitada la configuración de SSL.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/use-ssl.png)

1. En la pestaña **Esquemas**, elija **Todas las bases de datos** o introduzca el filtro “\$1:\$1” en el campo del **patrón del esquema**. Haga clic en el enlace **Probar la conexión** para probar la conexión.  
![\[La pestaña Esquemas de la interfaz de Orígenes de datos y controladores con la opción Todas las bases de datos seleccionada. Aparece un mensaje de Realizado correctamente sobre el enlace de Probar conexión.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/schemas.png)

1. Una vez que la conexión se haya probado correctamente, haga clic en **Aceptar** para guardar la configuración del origen de datos.

## Características de DataGrip
<a name="data-grip-features"></a>

DataGrip ofrece varias características para ayudarle a trabajar con Amazon DocumentDB de forma eficiente:
+ **Editor de SQL**: escriba y ejecute consultas tipo SQL en sus colecciones de DocumentDB mediante el editor SQL de DataGrip.
+ **Generador visual de consultas**: utilice el generador visual de consultas para crear consultas de forma gráfica sin escribir el código SQL.
+ **Administración de esquemas**: administre fácilmente el esquema de su base de datos, incluida la creación, modificación y eliminación de colecciones.
+ **Visualización de datos**: vea y analice sus datos con varias herramientas de visualización disponibles en DataGrip.
+ **Exportación e importación de datos**: transfiera datos entre Amazon DocumentDB y otras bases de datos mediante las características de exportación e importación de DataGrip.

Consulte la [documentación oficial de DataGrip](https://www.jetbrains.com/datagrip/features/) para obtener características y consejos más avanzados sobre cómo trabajar con Amazon DocumentDB y otros sistemas de bases de datos.

# Conectarse mediante Amazon EC2
<a name="connect-ec2"></a>

En esta sección se describe cómo configurar la conectividad entre un clúster de Amazon DocumentDB y Amazon EC2 y cómo acceder al clúster de Amazon DocumentDB desde la instancia de Amazon EC2.

Hay dos opciones para configurar la conexión de EC2:
+ [Conexión automática de la instancia de EC2 a una base de datos de Amazon DocumentDB](connect-ec2-auto.md): utilice la característica de conexión automática de la consola de EC2 para configurar automáticamente la conexión entre la instancia de EC2 y una base de datos de Amazon DocumentDB nueva o existente. Esta conexión permite que el tráfico se desplace entre la instancia de EC2 y la base de datos de Amazon DocumentDB. Esta opción se utiliza normalmente para probar y crear nuevos grupos de seguridad.
+ [Conexión manual de la instancia de EC2 a la base de datos de Amazon DocumentDB](connect-ec2-manual.md): configure la conexión entre la instancia de EC2 y la base de datos de Amazon DocumentDB mediante la configuración y la asignación manuales de los grupos de seguridad para que reproduzcan la configuración que se crea mediante la característica de conexión automática. Esta opción se suele utilizar para cambiar configuraciones más avanzadas y usar los grupos de seguridad existentes.

## Requisitos previos
<a name="connect-ec2-prerequisites"></a>

Independientemente de la opción y antes de crear el primer clúster de Amazon DocumentDB, debe hacer lo siguiente:

**Creación de una cuenta de Amazon Web Services (AWS)**  
Para empezar a utilizar Amazon DocumentDB, debe tener una cuenta de Amazon Web Services (AWS). La AWS cuenta es gratuita. Solo se paga por los servicios y los recursos que se utilicen.  
Si no tiene una Cuenta de AWS, complete los siguientes pasos para crearla.  

**Para suscribirse a una Cuenta de AWS**

1. Abrir [https://portal.aws.amazon.com/billing/registro](https://portal.aws.amazon.com/billing/signup).

1. Siga las instrucciones que se le indiquen.

   Parte del procedimiento de registro consiste en recibir una llamada telefónica o mensaje de texto e indicar un código de verificación en el teclado del teléfono.

   Cuando te registras en un Cuenta de AWS, *Usuario raíz de la cuenta de AWS*se crea un. El usuario raíz tendrá acceso a todos los Servicios de AWS y recursos de esa cuenta. Como práctica recomendada de seguridad, asigne acceso administrativo a un usuario y utilice únicamente el usuario raíz para realizar [Tareas que requieren acceso de usuario raíz](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks).

**Si lo desea, configure los permisos AWS Identity and Access Management (IAM) necesarios.**  
El acceso para gestionar los recursos de Amazon DocumentDB, como clústeres, instancias y grupos de parámetros de clústeres, requiere credenciales que AWS pueda utilizar para autenticar sus solicitudes. Para obtener más información, consulte [Identity and Access Management para Amazon DocumentDB](security-iam.md).   

1. En la barra de búsqueda Consola de administración de AWS, escriba IAM y seleccione **IAM** en el menú desplegable que aparece.

1. Cuando esté en la consola de IAM, seleccione **Usuarios** en el panel de navegación.

1. Seleccione su nombre de usuario.

1. Haga clic en el botón **Añadir permisos**.

1. Seleccione **Asociar directamente las políticas existentes**.

1. Escriba `AmazonDocDBFullAccess` en la barra de búsqueda y selecciónelo en cuanto aparezca en los resultados de búsqueda.

1. Haga clic en el botón azul de la parte inferior que dice **Siguiente: Revisión**.

1. Haga clic en el botón azul de la parte inferior que dice **Añadir permisos**.

**Creación de una Amazon Virtual Private Cloud (Amazon VPC)**  
En función del lugar en el que se Región de AWS encuentre, es posible que ya tenga creada una VPC predeterminada o no. Si no cuenta con una VPC determinada, complete el paso 1 de la [Introducción a Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html) en la *Guía del usuario de Amazon VPC*. Esto tardará menos de cinco minutos.

# Conexión automática de Amazon EC2
<a name="connect-ec2-auto"></a>

**Topics**
+ [Conexión automática de una instancia de EC2 a una nueva base de datos de Amazon DocumentDB](#auto-connect-ec2.process)
+ [Conexión automática de una instancia de EC2 a una base de datos de Amazon DocumentDB existente](#auto-connect-ec2-existing-cluster)
+ [Descripción general de la conectividad automática con una instancia de EC2](#auto-connect-ec2.overview)
+ [Visualización de los recursos de computación conectados](#auto-connect-ec2.compute)

Antes de configurar una conexión entre una instancia de EC2 y una nueva base de datos de Amazon DocumentDB, asegúrese de cumplir con los requisitos descritos en [Descripción general de la conectividad automática con una instancia de EC2](#auto-connect-ec2.overview). Si hace cambios en los grupos de seguridad después de configurar la conectividad, los cambios pueden afectar a la conexión entre la instancia de EC2 y la base de datos de Amazon DocumentDB. 

**nota**  
Solo puede configurar automáticamente una conexión entre una instancia de EC2 y una base de datos de Amazon DocumentDB automáticamente mediante la Consola de administración de AWS. No puede configurar una conexión automáticamente con la API AWS CLI o Amazon DocumentDB.

## Conexión automática de una instancia de EC2 a una nueva base de datos de Amazon DocumentDB
<a name="auto-connect-ec2.process"></a>

En el siguiente proceso se presupone que ha completado los pasos que se detallan en el tema [Requisitos previos](connect-ec2.md#connect-ec2-prerequisites).

**Topics**
+ [Paso 1: creación de una instancia de Amazon EC2](#auto-connect-ec2.launch-ec2-instance)
+ [Paso 2: creación de un clúster de Amazon DocumentDB](#auto-connect-ec2.launch-cluster)
+ [Paso 3: conexión a la instancia de Amazon EC2](#manual-connect-ec2.connect)
+ [Paso 4: instalación del intérprete de comandos de MongoDB](#auto-connect-ec2.install-mongo-shell)
+ [Paso 5: administración de TLS de Amazon DocumentDB](#auto-connect-ec2.tls)
+ [Paso 6: conexión al clúster de Amazon DocumentDB](#auto-connect-ec2.connect-use)
+ [Paso 7: inserción y consulta de datos](#auto-cloud9-insert-query)
+ [Paso 8: exploración](#auto-connect-ec2.explore)

### Paso 1: creación de una instancia de Amazon EC2
<a name="auto-connect-ec2.launch-ec2-instance"></a>

En este paso, creará una instancia de Amazon EC2 en la misma región y Amazon VPC que utilizará más adelante para aprovisionar el clúster de Amazon DocumentDB. 

1. En el panel de la consola de Amazon EC2, seleccione **Lanzar instancia**.  
![\[La sección Lanzar instancia en la consola de Amazon EC2.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/launch-instance.png)

1. Ingrese un nombre o identificador en el campo **Nombre** ubicado en la sección **Nombres y etiquetas**.

1. En la lista desplegable **Imagen de máquina de Amazon (AMI)**, busque la **AMI de Amazon Linux 2** y selecciónela.  
![\[La interfaz Imágenes de aplicaciones y sistema operativo con la opción AMI de Amazon Linux 2 seleccionada en la sección Inicio rápido.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/linux2-ami.png)

1. Busque y seleccione **t3.micro** en la lista desplegable de **Tipo de instancia**.

1. En la sección **Par de claves (inicio de sesión)**, ingrese el identificador de un par de claves existente o elija **Crear un par de claves nuevo**.  
![\[La interfaz Par de claves, en la que se muestra el campo del nombre del par de claves y la opción Crear un nuevo par de claves.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/key-pair.png)

   También debe proporcionar un par de claves de Amazon EC2.
   + Si tiene un par de claves de Amazon EC2:

     1. Seleccione un par de claves, elija su par de claves de la lista.

     1. Debe tener el archivo de clave privada (archivo .pem o .ppk) a su disposición para poder iniciar sesión en la instancia de Amazon EC2.
   + Si no tiene un par de claves de Amazon EC2:

     1. Seleccione **Crear un par de claves nuevo** y aparecerá el cuadro de diálogo **Crear par de claves**.

     1. Escriba un nombre en el campo **Nombre del par de claves**.

     1. Seleccione el **Tipo de par de claves** y el **Formato de archivo de clave privada**. 

     1. Elija **Crear par de claves**.  
![\[La interfaz Crear par de claves con campos para el nombre, el tipo y el formato de archivo del par de claves. El botón Crear par de claves se encuentra en la esquina inferior derecha.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/create-key-pair.png)
**nota**  
Por motivos de seguridad, le recomendamos encarecidamente que utilice un par de claves para la conectividad a Internet y SSH con la instancia de EC2.

1. **Opcional:** en la sección **Configuración de red**, en **Firewall (grupos de seguridad)**, seleccione **Crear grupo de seguridad**.  
![\[La interfaz Configuración de red, en la que se muestran opciones para crear un grupo de seguridad.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/firewall.png)

   Elija **Crear grupo de seguridad** (compruebe todas las reglas de tráfico que se aplican a su conectividad con EC2).
**nota**  
Si desea utilizar un grupo de seguridad existente, siga las instrucciones de [Conexión manual de Amazon EC2](connect-ec2-manual.md).

1. En la sección **Resumen**, revise la configuración de EC2 y, si es correcta, elija **Lanzar instancia**.

### Paso 2: creación de un clúster de Amazon DocumentDB
<a name="auto-connect-ec2.launch-cluster"></a>

Mientras se aprovisiona la instancia de Amazon EC2, cree su clúster de Amazon DocumentDB. 

1. Navegue hasta la consola de Amazon DocumentDB y elija **Clústeres** en el panel de navegación.

1. Seleccione **Crear**.

1. Deje la configuración de **Tipo de clúster** como predeterminada en **Clúster basado en instancias**.

1. En **Configuración del clúster**, ingrese un nombre único en **Identificador de clúster**. Tenga en cuenta que la consola cambiará todos los nombres de los clústeres a minúsculas independientemente de cómo se ingresen.

   Deje **Versión del motor** con su valor predeterminado de **5.0.0**.

1. En **Configuración del almacenamiento en clúster**, deje la configuración predeterminada de **Amazon DocumentDB estándar**.

1. En **Configuración de instancias**:
   + En **Clase de instancia de base de datos**, elija **Clases optimizadas para memoria (incluidas las clases r)**, que es la opción predeterminada.

     La otra opción de instancia son las clases **NVMerespaldadas por comandos**. Para obtener más información, consulte [Instancias respaldadas por NVMe](db-instance-nvme.md).
   + En **Clase de instancia**, elija el tipo de instancia que se adapte a sus necesidades. Para obtener una explicación más detallada de las clases de instancia, consulte [Especificaciones de clases de instancias](db-instance-classes.md#db-instance-class-specs).
   + En **Número de instancias**, elija el número que mejor refleje sus necesidades. Recuerde que cuanto menor sea el número, menor será el costo y menor será el read/write volumen que puede administrar el clúster.  
![\[La interfaz de configuración con valores predeterminados para el identificador del clúster, la versión del motor y la clase de instancia, con el número de instancias establecido en uno.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/create-cluster/instance-config.png)

1. En **Conectividad**, elija **Conectarse a un recurso de computación de EC2**. Esta es la instancia de EC2 que creó en el paso 1.  
![\[La interfaz de conectividad con la opción Conectar a un recurso de computación de EC2 seleccionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2-connect.png)
**nota**  
La conexión a un recurso de computación de EC2 crea automáticamente un grupo de seguridad para la conexión del recurso de computación de EC2 al clúster de Amazon DocumentDB. Cuando haya terminado de crear el clúster y desee ver el grupo de seguridad recién creado, navegue hasta la lista de clústeres y elija el identificador del clúster. En la pestaña **Conectividad y seguridad**, vaya a **Grupos de seguridad** y busque su grupo en **Nombre del grupo de seguridad (ID)**. Contendrá el nombre del clúster y tendrá un aspecto similar al siguiente: `docdb-ec2-docdb-2023-12-11-21-33-41:i-0e4bb09985d2bbc4c (sg-0238e0b0bf0f73877)`.

1. En la sección **Autenticación**, ingrese un nombre de usuario para el usuario principal y, a continuación, elija **Autoadministrado**. Ingrese una contraseña y, a continuación, confírmela.

   Si, en su lugar, eligió **Administrado en AWS Secrets Manager**, consulte [Administración de contraseñas con Amazon DocumentDB y AWS Secrets Manager](docdb-secrets-manager.md) para obtener más información.

1. Elija **Create cluster**.

### Paso 3: conexión a la instancia de Amazon EC2
<a name="manual-connect-ec2.connect"></a>

Para instalar el intérprete de comandos de mongo, primero se debe conectar a la instancia de Amazon EC2. La instalación del intérprete de comandos de mongo permite conectarse a su clúster de Amazon DocumentDB y realizar consultas en él. Realice los siguientes pasos:

1. En la consola Amazon EC2, navegue hasta sus instancias y compruebe si la instancia que acaba de crear se está ejecutando. Si es así, haga clic en el ID de la instancia para seleccionar la instancia.  
![\[Tabla de instancias con una lista de dos instancias de la consola de Amazon EC2.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/ec2-instance-table.png)

1. Elija **Conectar**.  
![\[Resumen de instancias de una instancia de Amazon EC2. El botón Conectar se encuentra en la esquina superior derecha.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/ec2-instance-summary.png)

1. Hay cuatro opciones con pestañas para el método de conexión: Amazon EC2 Instance Connect, Session Manager, cliente SSH o consola serie de EC2. Debe elegir uno y seguir sus instrucciones. Cuando haya terminado, elija **Conectar**.  
![\[Interfaz en la que se muestran las opciones de configuración del método de conexión EC2 Instance Connect.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/connect-options.png)

**nota**  
Si su dirección IP ha cambiado después de iniciar este tutorial o si va a volver a su entorno más adelante, debe actualizar la regla de entrada del grupo de seguridad `demoEC2` para habilitar el tráfico entrante desde su nueva dirección de API.

### Paso 4: instalación del intérprete de comandos de MongoDB
<a name="auto-connect-ec2.install-mongo-shell"></a>

Ahora puede instalar el intérprete de comandos de MongoDB, que es una utilidad de línea de comandos que se utiliza para conectarse al clúster de Amazon DocumentDB y consultarlo. Actualmente hay dos versiones del intérprete de comandos de MongoDB: la versión más reciente, mongosh, y la versión anterior, el intérprete de comandos de mongo.

**importante**  
Existe una limitación conocida con los controladores de Node.js anteriores a la versión 6.13.1, ya que Amazon DocumentDB no los admite actualmente para la autenticación de identidad de IAM. Los controladores Node.js y las herramientas que utilizan el controlador Node.js (como mongosh) deben actualizarse al controlador Node.js versión 6.13.1 o posterior.

Siga las siguientes instrucciones para instalar el intérprete de comandos de MongoDB en su sistema operativo.

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

**Cómo instalar el intérprete de comandos de MongoDB en Amazon Linux**

Si *no* utiliza la autenticación de IAM y desea utilizar el último intérprete de comandos de MongoDB (mongosh) para conectarse a su clúster de Amazon DocumentDB, siga estos pasos:

1. Cree el archivo de repositorio. En la línea de comando de la instancia de EC2 que creó, escriba el siguiente comando:

   ```
   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. Cuando esté completo, instale mongosh con una de las siguientes opciones de comando en el símbolo del sistema:

   **Opción 1**: si eligió Amazon Linux 2023 (predeterminado) durante la configuración de Amazon EC2, introduzca este comando:

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

   **Opción 2**: si eligió Amazon Linux 2 durante la configuración de Amazon EC2, introduzca este comando:

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

Si utiliza la autenticación de IAM, debe utilizar la versión anterior del intérprete de comandos de MongoDB (5.0) para conectarse al clúster de Amazon DocumentDB. Siga estos pasos:

1. Cree el archivo de repositorio. En la línea de comando de la instancia de EC2 que creó, escriba el siguiente comando:

   ```
   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. Cuando esté completo, instale el intérprete de comandos de MongoDB 5.0 con la siguiente opción de comando en el símbolo del sistema:

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

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

**Cómo instalar mongosh en Ubuntu**

1. Importe la clave pública que utilizará el sistema de administración de paquetes.

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

1. Cree el archivo de lista `mongodb-org-5.0.list` para MongoDB mediante el comando correspondiente a su versión de 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 y actualice la base de datos del paquete local utilizando el siguiente comando:

   ```
   sudo apt-get update
   ```

1. Instale mongosh.

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

Para obtener información sobre cómo instalar las versiones anteriores de MongoDB en un sistema Ubuntu, consulte [Install MongoDB Community Edition on Ubuntu](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/).

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

Para instalar el intérprete de comandos de mongo en otros sistemas operativos, consulte el tema sobre [cómo instalar MongoDB Community Edition](https://www.mongodb.com/docs/manual/administration/install-community/) en la documentación de MongoDB.

------

### Paso 5: administración de TLS de Amazon DocumentDB
<a name="auto-connect-ec2.tls"></a>

Descargue el certificado CA para Amazon DocumentDB con el siguiente código: `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem` 

**nota**  
La seguridad de la capa de transporte (TLS) está habilitada de forma predeterminada para todos los clústeres nuevos de Amazon DocumentDB. Para obtener más información, consulte [Managing Amazon DocumentDB cluster TLS settings](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html).

### Paso 6: conexión al clúster de Amazon DocumentDB
<a name="auto-connect-ec2.connect-use"></a>

1. En la consola de Amazon DocumentDB, en **Clústeres**, localice su clúster. Haga clic en **Identificador del clúster** para elegir el clúster que creó.

1. En la pestaña **Conectividad y seguridad**, busque **Conectar a este clúster con el intérprete de comandos de mongo** en el cuadro **Conectar**:  
![\[Configuración de conexión del clúster con la cadena de conexión de MongoDB resaltada para conectarse a un clúster de Amazon DocumentDB mediante el intérprete de comandos de mongo.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/connect-mongosh.png)

   Copie la cadena de conexión proporcionada y péguela en el terminal.

   Haga los siguientes cambios en ella:

   1. Asegúrese de que tenga el nombre de usuario correcto en la cadena.

   1. Omita `<insertYourPassword>` para que el intérprete de comandos de mongo le pida la contraseña cuando se conecte.

   1. Opcional: si utiliza la autenticación de IAM o utiliza la versión anterior del intérprete de comandos de MongoDB, modifique la cadena de conexión de la siguiente manera:

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

      Sustituya `mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1` por la misma información de su clúster.

1. Pulse Intro en el terminal. Ahora se le solicitará la contraseña. Introduzca su contraseña.

1. Cuando introduzca la contraseña y pueda ver el mensaje `rs0 [direct: primary] <env-name>>`, significa que se ha conectado correctamente a su clúster de Amazon DocumentDB.

¿Tiene problemas para conectarse? Consulte [Solución de problemas de Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html).

### Paso 7: inserción y consulta de datos
<a name="auto-cloud9-insert-query"></a>

Ahora que está conectado a su clúster, puede realizar algunas consultas para familiarizarse con el uso de una base de datos de documentos.

1. Para insertar un solo documento, escriba lo siguiente:

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

   Obtiene el siguiente resultado:

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

1. Puede leer el documento que escribió con el comando `findOne()` (ya que solo devuelve un documento). La siguiente entrada:

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

   Obtiene el siguiente resultado:

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

1. Para realizar algunas consultas más, plantéese un caso de uso de perfiles de juegos. Primero, inserte algunas entradas en una colección titulada `profiles`. La siguiente entrada:

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

   Obtiene el siguiente resultado:

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

1. Utilice el comando `find()` para devolver todos los documentos de la colección de perfiles. La siguiente entrada:

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

   Obtendrá un resultado que coincidirá con los datos que escribió en el paso 3.

1. Utilice una consulta para un único documento mediante un filtro. La siguiente entrada:

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

   Obtiene el siguiente resultado:

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

1. Ahora intentemos buscar un perfil y modificarlo con el comando `findAndModify`. Le daremos al usuario Matt 10 puntos adicionales con el siguiente código:

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

   Se obtiene el siguiente resultado (tenga en cuenta que la puntuación aún no ha aumentado):

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

1. Puede comprobar que su puntuación ha cambiado con la siguiente consulta:

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

   Obtiene el siguiente resultado:

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

### Paso 8: exploración
<a name="auto-connect-ec2.explore"></a>

¡Enhorabuena\$1 Ha completado correctamente la Guía de inicio rápido para Amazon DocumentDB.

Pasos siguientes Descubra cómo aprovechar al máximo esta potente base de datos con algunas de sus características más populares:
+  [Administración de Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/managing-documentdb.html) 
+  [Escalado](https://docs.aws.amazon.com/documentdb/latest/developerguide/operational_tasks.html) 
+  [Copia de seguridad y restauración](https://docs.aws.amazon.com/documentdb/latest/developerguide/backup_restore.html) 

**nota**  
Para ahorrar costos, puede detener el clúster de Amazon DocumentDB para reducir los costos o eliminar el clúster. De forma predeterminada, tras 30 minutos de inactividad, el AWS Cloud9 entorno detendrá la instancia Amazon EC2 subyacente.

## Conexión automática de una instancia de EC2 a una base de datos de Amazon DocumentDB existente
<a name="auto-connect-ec2-existing-cluster"></a>

En el siguiente procedimiento se presupone que ya tiene un clúster de Amazon DocumentDB y una instancia de Amazon EC2.

**Acceso al clúster de Amazon DocumentDB y configuración de la conexión de Amazon EC2**

1. Acceda al clúster de Amazon DocumentDB.

   1. [Inicie sesión en y abra la Consola de administración de AWS consola de Amazon DocumentDB en https://console.aws.amazon.com /docdb.](https://console.aws.amazon.com/docdb)

   1. En el panel de navegación, seleccione **Clusters (Clústeres)**.
**sugerencia**  
Si no ve el panel de navegación del lado izquierdo de la pantalla, seleccione el icono de menú (![\[Hamburger menu icon with three horizontal lines.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/docdb-menu-icon.png)) en la esquina superior izquierda de la página.

   1. Para especificar el clúster que desea, seleccione el botón situado a la izquierda del nombre del clúster.

1. Configure la conexión de Amazon EC2.

   1. Elija **Acciones** y, a continuación, elija **Configurar conexión de EC2**.  
![\[La lista desplegable Acciones con la opción Configurar conexión a EC2 seleccionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/setup-ec2-connect.png)

      Aparece el cuadro de diálogo **Configurar conexión de EC2**.

   1. En el campo **Instancia de EC2**, elija la instancia de EC2 que desea conectar al clúster.  
![\[La interfaz Configurar conexión a EC2 con la lista desplegable Instancia de EC2 resaltada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/setup-ec2-connect-dialog.png)

   1. Elija **Continuar**.

      Aparece el cuadro de diálogo **Revisar y confirmar**.

   1. Asegúrese de que los cambios sean correctos. A continuación, elija **Configurar la conexión**.  
![\[La interfaz Revisión y confirmación, en la que se muestra un resumen de los cambios. El botón Configurar conexión se encuentra en la esquina inferior derecha.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/setup-ec2-review-confirm.png)

Si la operación se lleva a cabo correctamente, aparecerá la siguiente verificación:

![\[Mensaje de confirmación de una configuración de conexión correcta entre la base de datos de Amazon DocumentDB y la instancia de EC2.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/setup-ec2-connect-success.png)


## Descripción general de la conectividad automática con una instancia de EC2
<a name="auto-connect-ec2.overview"></a>

Cuando se configura una conexión entre una instancia de EC2 y una base de datos de Amazon DocumentDB, Amazon DocumentDB configura automáticamente el grupo de seguridad de la VPC para la instancia de EC2 y la base de datos de Amazon DocumentDB.

Estos son los requisitos para conectar una instancia de EC2 a una base de datos de Amazon DocumentDB:
+ La instancia de EC2 debe existir en la misma VPC que la base de datos de Amazon DocumentDB.

  Si no existen instancias de EC2 en la misma VPC, la consola proporciona un enlace para crear una.
+ El usuario que establece la conectividad debe tener permisos para realizar las siguientes operaciones de Amazon EC2:
  + `ec2:AuthorizeSecurityGroupEgress`
  + `ec2:AuthorizeSecurityGroupIngress`
  + `ec2:CreateSecurityGroup`
  + `ec2:DescribeInstances`
  + `ec2:DescribeNetworkInterfaces`
  + `ec2:DescribeSecurityGroups`
  + `ec2:ModifyNetworkInterfaceAttribute`
  + `ec2:RevokeSecurityGroupEgress`

Si la instancia de la base de datos y la instancia de EC2 se encuentran en diferentes zonas de disponibilidad, su cuenta podría incurrir en costos cruzados de la zona de disponibilidad.

Cuando se establece una conexión con una instancia de EC2, Amazon DocumentDB lleva a cabo una acción basada en la configuración actual de los grupos de seguridad asociados a la base de datos de Amazon DocumentDB y la instancia de EC2, como se describe en la siguiente tabla:


| Configuración actual del grupo de seguridad de Amazon DocumentDB | Configuración del grupo de seguridad de EC2 actual | Acción de Amazon DocumentDB | 
| --- | --- | --- | 
| Hay uno o más grupos de seguridad asociados a la base de datos de Amazon DocumentDB con un nombre que coincide con el patrón DocumentDB-ec2-n. No se ha modificado ningún grupo de seguridad que coincida con el patrón. Este grupo de seguridad tiene solo una regla de entrada con el grupo de seguridad de VPC de la instancia de EC2 como origen. | Hay uno o más grupos de seguridad asociados a la instancia de EC2 con un nombre que coincide con el patrón DocumentDB-ec2-n (donde n es un número). No se ha modificado ningún grupo de seguridad que coincida con el patrón. Este grupo de seguridad solo tiene una regla de salida con el grupo de seguridad de VPC de la base de datos de Amazon DocumentDB como origen. | Amazon DocumentDB no lleva a cabo ninguna acción. Ya se configuró automáticamente una conexión entre la instancia de EC2 y la base de datos de Amazon DocumentDB. Como ya existe una conexión entre la instancia de EC2 y la base de datos de Amazon DocumentDB, los grupos de seguridad no se modifican. | 
| Se aplica alguna de las siguientes condiciones: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/connect-ec2-auto.html)  | Se aplica alguna de las siguientes condiciones: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/connect-ec2-auto.html) | Acción de Amazon DocumentDB: creación de nuevos grupos de seguridad | 
| Hay uno o más grupos de seguridad asociados a la base de datos de Amazon DocumentDB con un nombre que coincide con el patrón DocumentDB-ec2-n. No se ha modificado ningún grupo de seguridad que coincida con el patrón. Este grupo de seguridad tiene solo una regla de entrada con el grupo de seguridad de VPC de la instancia de EC2 como origen. | Hay uno o más grupos de seguridad asociados a la instancia de EC2 con un nombre que coincide con el patrón ec2-DocumentDB-n. Sin embargo, Amazon DocumentDB no puede usar ninguno de estos grupos de seguridad para la conexión con la base de datos de Amazon DocumentDB. Amazon DocumentDB no puede usar un grupo de seguridad que no tenga una regla de salida con el grupo de seguridad de la VPC de la base de datos de Amazon DocumentDB como origen. Amazon DocumentDB tampoco puede usar un grupo de seguridad que se haya modificado. | Acción de Amazon DocumentDB: creación de nuevos grupos de seguridad | 
| Hay uno o más grupos de seguridad asociados a la base de datos de Amazon DocumentDB con un nombre que coincide con el patrón DocumentDB-ec2-n. No se ha modificado ningún grupo de seguridad que coincida con el patrón. Este grupo de seguridad tiene solo una regla de entrada con el grupo de seguridad de VPC de la instancia de EC2 como origen. | Existe un grupo de seguridad de EC2 válido para la conexión, pero no está asociado a la instancia de EC2. Este grupo de seguridad tiene un nombre que coincide con el patrón DocumentDB-ec2-n. No se ha modificado. Solo tiene una regla de salida con el grupo de seguridad de VPC de la base de datos de Amazon DocumentDB como origen. | Acción de Amazon DocumentDB: asociación de un grupo de seguridad de EC2 | 
| Se aplica alguna de las siguientes condiciones: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/connect-ec2-auto.html)  | Hay uno o más grupos de seguridad asociados a la instancia de EC2 con un nombre que coincide con el patrón DocumentDB-ec2-n. No se ha modificado ningún grupo de seguridad que coincida con el patrón. Este grupo de seguridad solo tiene una regla de salida con el grupo de seguridad de VPC de la base de datos de Amazon DocumentDB como origen. | Acción de Amazon DocumentDB: creación de nuevos grupos de seguridad | 

**Acción de Amazon DocumentDB: creación de nuevos grupos de seguridad**

Amazon DocumentDB lleva a cabo las siguientes acciones:
+ Crea un nuevo grupo de seguridad que coincide con el patrón `DocumentDB-ec2-n`. Este grupo de seguridad tiene una regla de entrada con el grupo de seguridad de VPC de la instancia de EC2 como origen. Este grupo de seguridad está asociado a la base de datos de Amazon DocumentDB y permite que la instancia de EC2 acceda a la base de datos de Amazon DocumentDB.
+ Crea un nuevo grupo de seguridad que coincide con el patrón `ec2-DocumentDB-n`. Este grupo de seguridad tiene una regla de salida con el grupo de seguridad de VPC de la base de datos de Amazon DocumentDB como origen. Este grupo de seguridad está asociado a la instancia de EC2 y permite que la instancia de EC2 envíe tráfico a la base de datos de Amazon DocumentDB.

**Acción de Amazon DocumentDB: asociación de un grupo de seguridad de EC2**

Amazon DocumentDB asocia el grupo de seguridad de EC2 válido y existente con la instancia de EC2. Este grupo de seguridad permite que la instancia de EC2 envíe tráfico a la base de datos de Amazon DocumentDB.

## Visualización de los recursos de computación conectados
<a name="auto-connect-ec2.compute"></a>

Puede utilizarla Consola de administración de AWS para ver los recursos informáticos que están conectados a una base de datos de Amazon DocumentDB. Los recursos que se muestran incluyen conexiones de recursos informáticos que se configuraron automáticamente. Puede definir la conectividad con los recursos informáticos de manera automática de las siguientes maneras:
+ Puede seleccionar el recurso informático al crear la base de datos. Para obtener más información, consulte [Creación de un clúster de Amazon DocumentDB](db-cluster-create.md) y Creación de un clúster de base de datos Multi-AZ. 
+ Puede configurar la conectividad entre una base de datos existente y un recurso informático. Para obtener más información, consulte [Conexión automática de Amazon EC2](#connect-ec2-auto). 

Los recursos informáticos de la lista no incluyen los que se conectaron a la base de datos manualmente. Por ejemplo, puede permitir que un recurso informático acceda a una base de datos manualmente añadiendo una regla al grupo de seguridad de la VPC asociado a la base de datos.

Para que un recurso informático coincida, se deben cumplir las siguientes condiciones:
+ El nombre del grupo de seguridad asociado al recurso de computación coincide con el patrón `ec2-DocumentDB-n` (donde n es un número).
+ El grupo de seguridad asociado al recurso de computación tiene una regla de salida con el rango de puertos establecido en el puerto utilizado por la base de datos de Amazon DocumentDB.
+ El grupo de seguridad asociado al recurso de computación tiene una regla de salida en la que el origen está establecido en un grupo de seguridad asociado a la base de datos de Amazon DocumentDB.
+ El nombre del grupo de seguridad asociado a la base de datos de Amazon DocumentDB coincide con el patrón `DocumentDB-ec2-n` (donde n es un número).
+ El grupo de seguridad asociado a la base de datos de Amazon DocumentDB tiene una regla de entrada con el rango de puertos establecido en el puerto utilizado por la base de datos de Amazon DocumentDB.
+ El grupo de seguridad asociado a la base de datos de Amazon DocumentDB tiene una regla de entrada con el origen establecido en un grupo de seguridad asociado al recurso de computación.

**Visualización de los recursos de computación que están conectados a una base de datos de Amazon DocumentDB**

1. [Inicie sesión en y abra la Consola de administración de AWS consola de Amazon DocumentDB en https://console.aws.amazon.com /docdb.](https://console.aws.amazon.com/docdb)

1. En el panel de navegación, elija **Bases de datos** y, luego, el nombre de la instancia de base de datos de Amazon DocumentDB.

1. En la pestaña **Conectividad y seguridad**, consulte los recursos de computación en la sección **Recursos de computación conectados**.

# Conexión manual de Amazon EC2
<a name="connect-ec2-manual"></a>

**Topics**
+ [Paso 1: creación de una instancia de Amazon EC2](#manual-connect-ec2.launch-ec2-instance)
+ [Paso 2: crear un grupo de seguridad](#manual-connect-ec2.security-group)
+ [Paso 3: crear un clúster de Amazon DocumentDB](#manual-connect-ec2.launch-cluster)
+ [Paso 4: conectarse a su instancia de Amazon EC2](#manual-connect-ec2.connect)
+ [Paso 5: instalación del intérprete de comandos de MongoDB](#manual-connect-ec2.install-mongo-shell)
+ [Paso 6: administrar TLS de Amazon DocumentDB](#manual-connect-ec2.tls)
+ [Paso 7: conectarse a su clúster de Amazon DocumentDB](#manual-connect-ec2.connect-use)
+ [Paso 8: insertar y consultar datos](#manual-cloud9-insert-query)
+ [Paso 9: explorar](#manual-connect-ec2.explore)

En los siguientes pasos se presupone que ha completado los pasos que se detallan en el tema [Requisitos previos](connect-ec2.md#connect-ec2-prerequisites).

## Paso 1: creación de una instancia de Amazon EC2
<a name="manual-connect-ec2.launch-ec2-instance"></a>

En este paso, creará una instancia de Amazon EC2 en la misma región y Amazon VPC que utilizará más adelante para aprovisionar el clúster de Amazon DocumentDB. 

1. En el panel de la consola de Amazon EC2, seleccione **Lanzar instancia**.  
![\[La sección Lanzar instancia en la consola de Amazon EC2.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/launch-instance.png)

1. Ingrese un nombre o identificador en el campo **Nombre** ubicado en la sección **Nombres y etiquetas**.

1. En la lista desplegable **Imagen de máquina de Amazon (AMI)**, busque la **AMI de Amazon Linux 2** y selecciónela.  
![\[La interfaz Imágenes de aplicaciones y sistema operativo con la opción AMI de Amazon Linux 2 seleccionada en la sección Inicio rápido.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/linux2-ami.png)

1. Busque y seleccione **t3.micro** en la lista desplegable de **Tipo de instancia**.

1. En la sección **Par de claves (inicio de sesión)**, ingrese el identificador de un par de claves existente o elija **Crear un par de claves nuevo**.  
![\[La interfaz Par de claves, en la que se muestra el campo del nombre del par de claves y la opción Crear un nuevo par de claves.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/key-pair.png)

   También debe proporcionar un par de claves de Amazon EC2.
   + Si tiene un par de claves de Amazon EC2:

     1. Seleccione un par de claves, elija su par de claves de la lista.

     1. Debe tener el archivo de clave privada (archivo .pem o .ppk) a su disposición para poder iniciar sesión en la instancia de Amazon EC2.
   + Si no tiene un par de claves de Amazon EC2:

     1. Seleccione **Crear un par de claves nuevo** y aparecerá el cuadro de diálogo **Crear par de claves**.

     1. Escriba un nombre en el campo **Nombre del par de claves**.

     1. Seleccione el **Tipo de par de claves** y el **Formato de archivo de clave privada**. 

     1. Elija **Crear par de claves**.  
![\[La interfaz Crear par de claves con campos para el nombre, el tipo y el formato de archivo del par de claves. El botón Crear par de claves se encuentra en la esquina inferior derecha.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/create-key-pair.png)
**nota**  
Por motivos de seguridad, le recomendamos encarecidamente que utilice un par de claves para la conectividad a Internet y SSH con la instancia de EC2.

1. En la sección **Configuración de red**, en **Firewall (grupos de seguridad)**, elija **Crear grupo de seguridad** o **Seleccionar grupo de seguridad existente**.  
![\[La interfaz Configuración de red, en la que se muestran opciones para crear un grupo de seguridad.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/firewall.png)

   Si opta por seleccionar un grupo de seguridad existente, seleccione uno en la lista desplegable de **Grupos de seguridad comunes**.

   Si ha optado por crear un grupo de seguridad nuevo, haga lo siguiente:

   1. Compruebe todas las reglas de tráfico que se aplican a la conectividad de EC2.

   1. En el campo IP, elija **Mi IP** o seleccione **Personalizado** para elegir entre una lista de bloques de CIDR, listas de prefijos o grupos de seguridad. No recomendamos **Cualquier lugar** como opción, a menos que la instancia de EC2 se encuentre en una red aislada, ya que permite el acceso a la instancia de EC2 desde cualquier dirección IP.  
![\[El menú desplegable Mi IP.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/ip-field.png)

1. En la sección **Resumen**, revise la configuración de EC2 y, si es correcta, elija **Lanzar instancia**.

## Paso 2: crear un grupo de seguridad
<a name="manual-connect-ec2.security-group"></a>

Ahora creará un nuevo grupo de seguridad en su Amazon VPC predeterminada. El grupo de seguridad `demoDocDB` le permite conectarse a su clúster de Amazon DocumentDB en el puerto 27017 (el puerto predeterminado de Amazon DocumentDB) desde su instancia de Amazon EC2. 

1. En la [Consola de administración de Amazon EC2](https://console.aws.amazon.com/ec2), en **Red y seguridad**, elija **Grupos de seguridad**.  
![\[Panel de navegación de la consola Amazon DocumentDB con la opción Grupos de seguridad seleccionada en el menú desplegable Red y seguridad.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/nav-security-groups.png)

1. Elija **Creación de grupo de seguridad**.  
![\[El botón Crear grupo de seguridad.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/create-sg-btn-2.png)

1. En la sección **Detalles básicos**:

   1. En **Nombre del grupo de seguridad**, introduzca `demoDocDB`.

   1. En **Descripción**, escriba una descripción.

   1. En **VPC**, acepte el uso de la VPC predeterminada.

1. En la sección **Inbound rules (Reglas de entrada)**, elija **Add rule (agregar regla)**.

   1. En **Tipo**, elija **Regla TCP personalizada** (predeterminada).

   1. En **Rango de puertos**, introduzca `27017`.

   1. En **Source** (Origen), seleccione **Custom** (Personalizado). En el campo contiguo, busque el grupo de seguridad que acaba de crear en el paso 1. Es posible que tenga que actualizar el navegador para que la consola Amazon EC2 complete automáticamente el nombre de la fuente .  
![\[La sección de reglas de entrada, en la que se muestran los campos del tipo, el protocolo, el rango de puertos, el origen y la descripción. El botón Añadir regla se encuentra en la esquina inferior izquierda.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/inbound-rules.png)

1. Acepte todos los demás valores predeterminados y elija **Crear grupo de seguridad**.  
![\[El botón Crear grupo de seguridad.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/create-sg-btn-2.png)

## Paso 3: crear un clúster de Amazon DocumentDB
<a name="manual-connect-ec2.launch-cluster"></a>

Mientras se aprovisiona la instancia de Amazon EC2, creará su clúster de Amazon DocumentDB. 

1. Navegue hasta la consola de Amazon DocumentDB y elija **Clústeres** en el panel de navegación.

1. Seleccione **Crear**.

1. Deje la configuración de **Tipo de clúster** como predeterminada en **Clúster basado en instancias**.

1. En **Configuración del clúster**, ingrese un nombre único en **Identificador de clúster**. Tenga en cuenta que la consola cambiará todos los nombres de los clústeres a minúsculas independientemente de cómo se ingresen.

   Deje **Versión del motor** con su valor predeterminado de **5.0.0**.

1. En **Configuración del almacenamiento en clúster**, deje la configuración predeterminada de **Amazon DocumentDB estándar**.

1. En **Configuración de instancias**:
   + En **Clase de instancia de base de datos**, elija **Clases optimizadas para memoria (incluidas las clases r)**, que es la opción predeterminada.

     **La otra opción de instancia son NVMe las clases respaldadas por comandos.** Para obtener más información, consulte [Instancias respaldadas por NVMe](db-instance-nvme.md).
   + En **Clase de instancia**, elija el tipo de instancia que se adapte a sus necesidades. Para obtener una explicación más detallada de las clases de instancia, consulte [Especificaciones de clases de instancias](db-instance-classes.md#db-instance-class-specs).
   + En **Número de instancias**, elija el número que mejor refleje sus necesidades. Recuerde que cuanto menor sea el número, menor será el costo y menor será el read/write volumen que puede administrar el clúster.  
![\[La interfaz de configuración con valores predeterminados para el identificador del clúster, la versión del motor y la clase de instancia, con el número de instancias establecido en uno.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/create-cluster/instance-config.png)

1. En **Conectividad**, deje la configuración predeterminada de **No conectarse a un recurso de computación de EC2**.
**nota**  
La conexión a un recurso de computación de EC2 crea automáticamente grupos de seguridad para la conexión al clúster. Como en el paso anterior creó estos grupos de seguridad manualmente, debe seleccionar **No conectarse a un recurso de computación de EC2** para no crear un segundo conjunto de grupos de seguridad.

1. En la sección **Autenticación**, ingrese un nombre de usuario para el usuario principal y, a continuación, elija **Autoadministrado**. Ingrese una contraseña y, a continuación, confírmela.

   Si, en su lugar, eligió **Administrado en AWS Secrets Manager**, consulte [Administración de contraseñas con Amazon DocumentDB y AWS Secrets Manager](docdb-secrets-manager.md) para obtener más información.

1. Elija **Create cluster**.

## Paso 4: conectarse a su instancia de Amazon EC2
<a name="manual-connect-ec2.connect"></a>

La conexión de la instancia de Amazon EC2 le permitirá instalar el intérprete de comandos de MongoDB. La instalación del intérprete de comandos de mongo permite conectarse a su clúster de Amazon DocumentDB y realizar consultas en él. Realice los siguientes pasos:

1. En la consola Amazon EC2, navegue hasta sus instancias y compruebe si la instancia que acaba de crear se está ejecutando. Si es así, haga clic en el ID de la instancia para seleccionar la instancia.  
![\[Tabla de instancias con una lista de dos instancias de la consola de Amazon EC2\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/ec2-instance-table.png)

1. Elija **Conectar**.  
![\[Resumen de instancias de una instancia de Amazon EC2. El botón Conectar se encuentra en la esquina superior derecha.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/ec2-instance-summary.png)

1. Hay cuatro opciones con pestañas para el método de conexión: Amazon EC2 Instance Connect, Session Manager, cliente SSH o consola serie de EC2. Debe elegir uno y seguir sus instrucciones. Cuando haya terminado, elija **Conectar**.  
![\[Interfaz en la que se muestran las opciones de configuración del método de conexión EC2 Instance Connect.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ec2/connect-options.png)

**nota**  
Si su dirección IP ha cambiado después de iniciar este tutorial o si va a volver a su entorno más adelante, debe actualizar la regla de entrada del grupo de seguridad `demoEC2` para habilitar el tráfico entrante desde su nueva dirección de API.

## Paso 5: instalación del intérprete de comandos de MongoDB
<a name="manual-connect-ec2.install-mongo-shell"></a>

Ahora puede instalar el intérprete de comandos de MongoDB, que es una utilidad de línea de comandos que se utiliza para conectarse al clúster de Amazon DocumentDB y consultarlo. Actualmente hay dos versiones del intérprete de comandos de MongoDB: la versión más reciente, mongosh, y la versión anterior, el intérprete de comandos de mongo.

**importante**  
Existe una limitación conocida con los controladores de Node.js anteriores a la versión 6.13.1, ya que Amazon DocumentDB no los admite actualmente para la autenticación de identidad de IAM. Los controladores Node.js y las herramientas que utilizan el controlador Node.js (como mongosh) deben actualizarse al controlador Node.js versión 6.13.1 o posterior.

Siga las siguientes instrucciones para instalar el intérprete de comandos de MongoDB en su sistema operativo.

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

**Cómo instalar el intérprete de comandos de MongoDB en Amazon Linux**

Si *no* utiliza IAM y desea utilizar el último intérprete de comandos de MongoDB (mongosh) para conectarse a su clúster de Amazon DocumentDB, siga estos pasos:

1. Cree el archivo de repositorio. En la línea de comando de la instancia de EC2 que creó, escriba el siguiente comando:

   ```
   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. Cuando esté completo, instale mongosh con una de las siguientes opciones de comando en el símbolo del sistema:

   **Opción 1**: si eligió Amazon Linux 2023 (predeterminado) durante la configuración de Amazon EC2, introduzca este comando:

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

   **Opción 2**: si eligió Amazon Linux 2 durante la configuración de Amazon EC2, introduzca este comando:

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

Si utiliza IAM, debe utilizar la versión anterior del intérprete de comandos de MongoDB (5.0) para conectarse al clúster de Amazon DocumentDB. Siga estos pasos:

1. Cree el archivo de repositorio. En la línea de comando de la instancia de EC2 que creó, escriba el siguiente comando:

   ```
   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. Cuando esté completo, instale el intérprete de comandos de MongoDB 5.0 con la siguiente opción de comando en el símbolo del sistema:

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

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

**Cómo instalar mongosh en Ubuntu**

1. Importe la clave pública que utilizará el sistema de administración de paquetes.

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

1. Cree el archivo de lista `mongodb-org-5.0.list` para MongoDB mediante el comando correspondiente a su versión de 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 y actualice la base de datos del paquete local utilizando el siguiente comando:

   ```
   sudo apt-get update
   ```

1. Instale mongosh.

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

Para obtener información sobre cómo instalar las versiones anteriores de MongoDB en un sistema Ubuntu, consulte [Install MongoDB Community Edition on Ubuntu](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-ubuntu/).

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

Para instalar el intérprete de comandos de mongo en otros sistemas operativos, consulte el tema sobre [cómo instalar MongoDB Community Edition](https://www.mongodb.com/docs/manual/administration/install-community/) en la documentación de MongoDB.

------

## Paso 6: administrar TLS de Amazon DocumentDB
<a name="manual-connect-ec2.tls"></a>

Descargue el certificado CA para Amazon DocumentDB con el siguiente código: `wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem` 

**nota**  
La seguridad de la capa de transporte (TLS) está habilitada de forma predeterminada para todos los clústeres nuevos de Amazon DocumentDB. Para obtener más información, consulte [Managing Amazon DocumentDB cluster TLS settings](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html).

## Paso 7: conectarse a su clúster de Amazon DocumentDB
<a name="manual-connect-ec2.connect-use"></a>

1. En la consola de Amazon DocumentDB, en **Clústeres**, localice su clúster. Haga clic en **Identificador del clúster** para elegir el clúster que creó.  
![\[Lista de clústeres de Amazon DocumentDB en la que se muestra un clúster regional con detalles de la instancia principal.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/cluster-connect-choose.png)

1. En la pestaña **Conectividad y seguridad**, busque **Conectar a este clúster con el intérprete de comandos de mongo** en el cuadro **Conectar**:  
![\[Configuración de conexión del clúster con la cadena de conexión de MongoDB resaltada para conectarse a un clúster de Amazon DocumentDB mediante el intérprete de comandos de mongo.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/connect-mongosh.png)

   Copie la cadena de conexión proporcionada y péguela en el terminal.

   Haga los siguientes cambios en ella:

   1. Asegúrese de que tenga el nombre de usuario correcto en la cadena.

   1. Omita `<insertYourPassword>` para que el intérprete de comandos de mongo le pida la contraseña cuando se conecte.

   1. Opcional: si utiliza la autenticación de IAM o utiliza la versión anterior del intérprete de comandos de MongoDB, modifique la cadena de conexión de la siguiente manera:

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

      Sustituya `mydocdbcluster.cluster-cozt4xr9xv9b.us-east-1` por la misma información de su clúster.

1. Pulse Intro en el terminal. Ahora se le solicitará la contraseña. Introduzca su contraseña.

1. Cuando introduzca la contraseña y pueda ver el mensaje `rs0 [direct: primary] <env-name>>`, significa que se ha conectado correctamente a su clúster de Amazon DocumentDB.

¿Tiene problemas para conectarse? Consulte [Solución de problemas de Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html).

## Paso 8: insertar y consultar datos
<a name="manual-cloud9-insert-query"></a>

Ahora que está conectado a su clúster, puede realizar algunas consultas para familiarizarse con el uso de una base de datos de documentos.

1. Para insertar un solo documento, escriba lo siguiente:

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

   Obtiene el siguiente resultado:

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

1. Puede leer el documento que escribió con el comando `findOne()` (ya que solo devuelve un documento). La siguiente entrada:

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

   Obtiene el siguiente resultado:

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

1. Para realizar algunas consultas más, plantéese un caso de uso de perfiles de juegos. Primero, inserte algunas entradas en una colección titulada `profiles`. La siguiente entrada:

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

   Obtiene el siguiente resultado:

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

1. Utilice el comando `find()` para devolver todos los documentos de la colección de perfiles. La siguiente entrada:

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

   Obtendrá un resultado que coincidirá con los datos que escribió en el paso 3.

1. Utilice una consulta para un único documento mediante un filtro. La siguiente entrada:

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

   Obtiene el siguiente resultado:

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

1. Ahora intentemos buscar un perfil y modificarlo con el comando `findAndModify`. Le daremos al usuario Matt 10 puntos adicionales con el siguiente código:

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

   Se obtiene el siguiente resultado (tenga en cuenta que la puntuación aún no ha aumentado):

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

1. Puede comprobar que su puntuación ha cambiado con la siguiente consulta:

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

   Obtiene el siguiente resultado:

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

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

¡Enhorabuena\$1 Ha completado correctamente la Guía de inicio rápido para Amazon DocumentDB.

Pasos siguientes Descubra cómo aprovechar al máximo esta potente base de datos con algunas de sus características más populares:
+  [Administración de Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/managing-documentdb.html) 
+  [Escalado](https://docs.aws.amazon.com/documentdb/latest/developerguide/operational_tasks.html) 
+  [Copia de seguridad y restauración](https://docs.aws.amazon.com/documentdb/latest/developerguide/backup_restore.html) 

**nota**  
Para ahorrar costos, puede detener el clúster de Amazon DocumentDB para reducir los costos o eliminar el clúster. De forma predeterminada, tras 30 minutos de inactividad, el AWS Cloud9 entorno detendrá la instancia Amazon EC2 subyacente.

# Conexión mediante el controlador JDBC de Amazon DocumentDB
<a name="connect-jdbc"></a>

El controlador JDBC para Amazon DocumentDB proporciona una interfaz relacional de SQL para los desarrolladores y permite la conectividad desde herramientas de BI como Tableau y. DbVisualizer

Para obtener información más detallada, consulte la documentación del controlador [JDBC de Amazon DocumentDB](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/index.md) en. GitHub

**Topics**
+ [Introducción](#connect-jdbc-gettingstarted)
+ [Conexión a Amazon DocumentDB desde Tableau Desktop](connect-jdbc-tableau.md)
+ [Conéctese a Amazon DocumentDB desde DbVisualizer](connect-jdbc-DbVisualizer.md)
+ [Generación automática de esquemas JDBC](connect-jdbc-autoschemagen.md)
+ [Compatibilidad y limitaciones de SQL](connect-jdbc-sqlandlimits.md)
+ [Resolución de problemas](connect-jdbc-troubleshooting.md)

## Introducción
<a name="connect-jdbc-gettingstarted"></a>

**Paso 1. Creación de un clúster de Amazon DocumentDB**  
Si no ha creado un clúster de Amazon DocumentDB, cree uno siguiendo las instrucciones de la sección [Introducción](https://docs.aws.amazon.com/documentdb/latest/developerguide/get-started-guide.html) de la Guía para desarrolladores de Amazon DocumentDB.  
Amazon DocumentDB es un servicio exclusivo de nube privada virtual (VPC). Si se conecta desde una máquina local, fuera de la VPC del clúster, necesitará crear una conexión SSH a una instancia de Amazon EC2. En este caso, inicie el clúster siguiendo las instrucciones de [Conexión con EC2](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html). Consulte [Cómo usar un túnel SSH para conectarse a 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 obtener más información sobre los túneles SSH y cuándo podría necesitarlos. 

**Paso 2. Instalación de JRE o JDK**  
En función de la aplicación de BI que utilice, es posible que tenga instalada en su ordenador una instalación JRE o JDK de 64 bits, versión 8 o posterior. Puede descargar el Java SE Runtime Environment 8 [aquí.](https://www.oracle.com/ca-en/java/technologies/javase-jre8-downloads.html)

**Paso 3. Descarga del controlador JDBC de DocumentDB**  
Descargue el controlador JDBC de DocumentDB desde [aquí](https://github.com/aws/amazon-documentdb-jdbc-driver/releases). El controlador está empaquetado como un único archivo JAR (por ejemplo, documentdb-jdbc-1.0.0-all.jar).

**Paso 4. Cómo usar un túnel SSH para conectarse a Amazon DocumentDB**  
Los clústeres de Amazon DocumentDB (compatible con MongoDB) se implementan en una instancia de Amazon Virtual Private Cloud (Amazon VPC). Se puede acceder a ellos directamente mediante instancias de Amazon EC2 u otros AWS servicios que se desplieguen en la misma Amazon VPC. Además, EC2a instancias u otros AWS servicios de la misma AWS región o de otras regiones pueden acceder a Amazon DocumentDB mediante la interconexión de VPC. VPCs   
Puede utilizar la tunelización SSH (también conocida como reenvío de puertos) para acceder a los recursos de Amazon DocumentDB desde fuera de la VPC del clúster. Este será el caso de la mayoría de los usuarios que no ejecuten su aplicación en una máquina virtual de la misma VPC que el clúster de DocumentDB.  
Para crear un túnel SSH, necesita una instancia de Amazon EC2 que se ejecute en la misma VPC de Amazon que el clúster de Amazon DocumentDB. Puede usar una instancia EC2 existente en la misma VPC que el clúster o crear una. Si es así, puede configurar un túnel de SSH en el clúster de Amazon DocumentDB `sample-cluster.node.us-east-1.docdb.amazonaws.com` ejecutando el siguiente comando en el equipo 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 
```
La marca -L se utiliza para el reenvío de un puerto local. Este es un requisito previo para conectarse a cualquier herramienta de BI que se ejecute en un cliente externo a su VPC. Una vez realizado el paso anterior, puede pasar a los siguientes con la herramienta de BI que prefiera.   
Para obtener más información sobre los túneles SSH, consulte la documentación sobre [Uso de un túnel SSH para conectarse a 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 ).

# Conexión a Amazon DocumentDB desde Tableau Desktop
<a name="connect-jdbc-tableau"></a>

**Topics**
+ [Adición del controlador JDBC de Amazon DocumentDB](#connect-jdbc-tableau-adddriver)
+ [Conexión a Amazon DocumentDB mediante Tableau - Túnel SSH](#connect-jdbc-tableau-ssh)

## Adición del controlador JDBC de Amazon DocumentDB
<a name="connect-jdbc-tableau-adddriver"></a>

Para conectar con Amazon DocumentDB desde Tableau Desktop, debe descargar e instalar el controlador JDBC de Amazon DocumentDB y el conector de DocumentDB para Tableau.

1. Descargue el archivo JAR del controlador JDBC de Amazon DocumentDB del [repositorio de controladores JDBC de Amazon DocumentDB](https://github.com/aws/amazon-documentdb-jdbc-driver/releases) y cópielo en uno de los siguientes directorios según su sistema operativo:
   + *Windows* - `C:\Program Files\Tableau\Drivers`
   + *MacOS* - `~/Library/Tableau/Drivers`

1. Descargue el conector de DocumentDB para Tableau (un archivo TACO) del [sitio web de Tableau Exchange](https://exchange.tableau.com/products/821) y cópielo en su directorio *Mi* Tableau. Repository/Connectors 
   + *Windows* - `C:\Users\[user]\Documents\My Tableau Repository\Connectors`
   + *MacOS* - `/Users/[user]/Documents/My Tableau Repository/Connectors`

Para obtener información adicional, consulte la [documentación de Tableau](https://tableau.github.io/connector-plugin-sdk/docs/run-taco).

**nota**  
[Si utiliza certificados de CA más recientes, asegúrese de actualizar el controlador JDBC a la versión 1.4.5 (disponible en este repositorio). AWS GitHub ](https://github.com/aws/amazon-documentdb-jdbc-driver/releases/tag/v1.4.5)

## Conexión a Amazon DocumentDB mediante Tableau - Túnel SSH
<a name="connect-jdbc-tableau-ssh"></a>

Para conectarse a Tableau desde un equipo cliente fuera de la VPC de su clúster de DocumentDB, debe configurar un túnel SSH antes de seguir los pasos que se indican a continuación:

1. Inicie la aplicación Tableau Desktop.

1. Vaya a **Conectar** > **A un servidor** > **Más**. 

1.  Elija **Amazon DocumentDB de Amazon Web Services en** **Conectores instalados**.  
![\[La interfaz Conexión en Tableau Desktop muestra el submenú Más… en la sección A un servidor. La opción Amazon DocumentDB aparece resaltada en el submenú Conectores instalados.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/tableau-choose-docdb.png)

**Conexión a Amazon DocumentDB mediante Tableau: túnel SSH externo**

1. Introduzca los parámetros de conexión necesarios: **Nombre de host**, **Puerto**, **Base de datos**, **Nombre de usuario** y **Contraseña**. Los parámetros de conexión del ejemplo siguiente son equivalentes a la cadena de conexión JDBC: 

   `jdbc:documentdb://localhost:27019/test? tls=true&tlsAllowInvalidHostnames=true&scanMethod=random&scanLimit=1000&loginTimeoutSec=0&readPreference=primary&retryReads=true&schemaName=_default` con los parámetros de nombre de usuario y contraseña transferidos por separado en una colección de propiedades. Para obtener más información sobre los parámetros de la cadena de conexión, consulte la [documentación de GitHub del controlador JDBC de Amazon DocumentDB](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/setup/connection-string.md).   
![\[Pestaña General de la interfaz del conector de Amazon DocumentDB, en la que se muestran los campos de nombre de host, puerto, base de datos, nombre de usuario y contraseña.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/tableau-connect.png)

1. (Opcional) Puede encontrar opciones más avanzadas en la pestaña **Avanzado**.  
![\[Pestaña Avanzado de la interfaz del conector de Amazon DocumentDB, en la que se muestran opciones de conexión adicionales.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/tableau-advanced.png)

1. Seleccione **Iniciar sesión**.

**Conexión a Amazon DocumentDB mediante Tableau: túnel SSH interno**
**nota**  
Si prefiere no configurar el túnel SSH mediante un terminal, puede usar la GUI de Tableau para especificar los detalles de su instancia EC2, que el controlador JDBC utilizará de forma inherente para crear un túnel SSH. 

1. En la pestaña **Avanzado**, elija la opción **Habilitar el túnel SSH** para revisar otras propiedades.  
![\[Pestaña Avanzado de la interfaz del conector de Amazon DocumentDB con la opción Activar túnel SSH seleccionada y los campos de entrada SSH adicionales mostrados.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/tableau-advanced-Enablessh.png)

1. Introduzca el **Usuario SSH**, el **Nombre de host SSH** y el **Archivo de clave privada SSH**. 

1. (Opcional) Puede deshabilitar la opción de **verificación estricta de la clave de host de SSH**, que evita la verificación de la clave de host con un archivo de hosts conocido.
**nota**  
La desactivación de esta opción es menos segura, ya que puede provocar un ataque. [man-in-the-middle](https://en.wikipedia.org/wiki/Man-in-the-middle_attack)  
![\[Pestaña Avanzado de la interfaz del conector de Amazon DocumentDB con la opción Verificación estricta de la clave de host de SSH desactivada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/tableau-advanced-sshhostkeycheck.png)

1. Introduzca los parámetros necesarios: **Nombre de host**, **Puerto**, **Base de datos**, **Nombre de usuario** y **Contraseña**.
**nota**  
Asegúrese de utilizar el punto de conexión del clúster de DocumentDB y no localhost cuando utilice la opción de túnel SSH interno.  
![\[Pestaña General de la interfaz del conector de Amazon DocumentDB, en la que se muestran los campos de nombre de host, puerto, base de datos, nombre de usuario y contraseña.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/tableau-hostname.png)

1. Elija **Iniciar sesión**.

# Conéctese a Amazon DocumentDB desde DbVisualizer
<a name="connect-jdbc-DbVisualizer"></a>

**Topics**
+ [Adición del controlador JDBC de Amazon DocumentDB](#connect-jdbc-DbVisualizer-adddriver)
+ [Conexión a Amazon DocumentDB mediante DbVisualizer](#connect-jdbc-DbVisualizer-connect)

## Adición del controlador JDBC de Amazon DocumentDB
<a name="connect-jdbc-DbVisualizer-adddriver"></a>

Para conectarse a Amazon DocumentDB desde, primero DbVisualizer debe importar el controlador JDBC de Amazon DocumentDB.

1. Inicie la DbVisualizer aplicación y navegue hasta la ruta del menú: **Herramientas** > Administrador de controladores...

1. Elija **\$1** (o en el menú, seleccione **Controlador > Crear controlador**).

1. Establezca **Name (Nombre)** en `DocumentDB`.

1. Defina el **formato de URL** en `jdbc:documentdb://<host>[:port]/<database>[?option=value[&option=value[...]]]`

1. Elija el botón de **carpeta** y luego seleccione el archivo JAR del controlador JDBC de Amazon DocumentDB y luego pulse el botón **Abrir**.

1. Compruebe que el campo **Clase de controlador** esté establecido en `software.amazon.documentdb.jdbc.DocumentDbDriver`. La configuración del Administrador de controladores para **DocumentDB** debe tener el siguiente aspecto.  
![\[La interfaz de configuración del controlador incluye DbVisualizer el nombre de Amazon DocumentDB, el formato de URL y las configuraciones de clase de controlador ingresadas.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/DbVisualizer-adddriver.jpg)

1. Cierre el cuadro de diálogo. El controlador JDBC de Amazon DocumentDB estará configurado y listo para usarse.

## Conexión a Amazon DocumentDB mediante DbVisualizer
<a name="connect-jdbc-DbVisualizer-connect"></a>

Conéctese a Amazon DocumentDB mediante DbVisualizer

1. Si se conecta desde fuera de la VPC del clúster de Amazon DocumentDB, asegúrese de haber configurado un túnel SSH.

1. Seleccione **Base de datos > Crear conexión a base de datos** en el menú de nivel superior.

1. En el campo **Nombre**, ingrese un nombre descriptivo.

1. Establezca **Controlador (JDBC)** en el controlador de DocumentDB que creó en la sección anterior.

1. Establezca la **URL de la base de datos** en la cadena de conexión JDBC. 

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

1. Establezca el **ID de usuario de la base de datos** en su ID de usuario de Amazon DocumentDB.

1. Establezca la **contraseña de la base de datos** como la contraseña correspondiente al ID de usuario.

   El cuadro de diálogo de conexión a la base de datos debe tener el siguiente aspecto:  
![\[Interfaz Conexión a base de datos con configuración de DocumentDB.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/DbVisualizer-connect.jpg)

1. Elija **Connect (Conectar)**.

# Generación automática de esquemas JDBC
<a name="connect-jdbc-autoschemagen"></a>

Amazon DocumentDB es una base de datos de documentos y, por lo tanto, no tiene el concepto de tablas y esquema. Sin embargo, las herramientas de inteligencia empresarial, como Tableau, esperan que la base de datos a la que se conecta presente un esquema. En concreto, cuando la conexión del controlador JDBC necesite obtener el esquema de la colección en la base de datos, consultará todas las colecciones de la base de datos. El controlador determinará si ya existe una versión en caché del esquema para esa colección. Si no existe una versión en caché, tomará muestras de la colección de documentos y creará un esquema basado en el siguiente comportamiento. 

**Topics**
+ [Limitaciones de generación de esquemas](#connect-jdbc-autoschemagen-limits)
+ [Opciones del método de análisis](#connect-jdbc-autoschemagen-scanningoptions)
+ [Tipos de datos de Amazon DocumentDB](#connect-jdbc-autoschemagen-datatypes)
+ [Asignación de campos de documentos escalares](#connect-jdbc-autoschemagen-scalarfields)
+ [Manejo de tipos de datos de objetos y matrices](#connect-jdbc-autoschemagen-objectandarray)

## Limitaciones de generación de esquemas
<a name="connect-jdbc-autoschemagen-limits"></a>

El controlador JDBC de DocumentDB impone un límite de 128 caracteres a la longitud de los identificadores. El generador de esquemas puede truncar la longitud de los identificadores generados (nombres de tablas y nombres de columnas) para garantizar que se ajusten a ese límite. 

## Opciones del método de análisis
<a name="connect-jdbc-autoschemagen-scanningoptions"></a>

El comportamiento del muestreo se puede modificar mediante la cadena de conexión o las opciones de origen de datos.
+ *scanMethod=*<option>
  + *random - (predeterminado): los documentos de muestra se devuelven en orden aleatorio.*
  + *idForward*: los documentos de muestra se devuelven por orden de identificación.
  + *idReverse*: los documentos de muestra se devuelven por orden inverso de identificación.
  + *all (todos)*: muestra todos los documentos de la colección.
+ *scanLimit=*<n>: el número de documentos que se van a muestrear. El valor debe ser un número entero positivo. El valor predeterminado es *1000*. Si *ScanMethod* está establecido en *todos*, se omite esta opción.

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

El servidor de Amazon DocumentDB admite varios tipos de datos de MongoDB. A continuación se enumeran los tipos de datos compatibles y sus tipos de datos JDBC asociados.


| Tipos de datos de MongoDB | Compatible con DocumentDB | Tipo de datos JDBC | 
| --- | --- | --- | 
| Datos Binary | Sí | VARBINARY | 
| Booleano | Sí | BOOLEANO | 
| Double | Sí | DOUBLE | 
| Entero de 32 bits | Sí | INTEGER | 
| Entero de 64 bits | Sí | BIGINT | 
| Cadena | Sí | VARCHAR | 
| ObjectId | Sí | VARCHAR | 
| Date | Sí | TIMESTAMP | 
| Nulo | Sí | VARCHAR | 
| Expresión regular | Sí | VARCHAR | 
| Timestamp | Sí | VARCHAR | 
| MinKey | Sí | VARCHAR | 
| MaxKey | Sí | VARCHAR | 
| Objeto | Sí | tabla virtual | 
| Matriz | Sí | tabla virtual | 
| Decimal128 | No | DECIMAL | 
| JavaScript | No | VARCHAR | 
| JavaScript (con alcance) | No | VARCHAR | 
| Sin definir | No | VARCHAR | 
| Símbolo | No | VARCHAR | 
| DBPointer (4.0\$1) | No | VARCHAR | 

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

Al escanear una muestra de documentos de una colección, el controlador JDBC creará uno o más esquemas para representar las muestras de la colección. En general, un campo escalar del documento se asigna a una columna del esquema de la tabla. Por ejemplo, en una colección denominada team y en un solo documento `{ "_id" : "112233", "name" : "Alastair", "age": 25 }`, esto se asignaría al esquema:


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| equipo | id de equipo | VARCHAR | PK | 
| equipo | name | VARCHAR |  | 
| equipo | edad | INTEGER |  | 

### Promoción de conflictos de tipos de datos
<a name="connect-jdbc-autoschemagen-conflictpromo"></a>

Al digitalizar los documentos de muestra, es posible que los tipos de datos de un campo no sean coherentes de un documento a otro. En este caso, el controlador JDBC convertirá el tipo de datos JDBC en un tipo de datos común que se adapte a todos los tipos de datos de los documentos muestreados. 

Por ejemplo:

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

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

El campo *age (edad)* es de tipo entero de 32 bits en el primer documento, pero de tipo cadena en el segundo documento. En este caso, el controlador JDBC promoverá el tipo de datos JDBC a VARCHAR para gestionar cualquier tipo de datos cuando los encuentre.


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| equipo | id de equipo | VARCHAR | PK | 
| equipo | name | VARCHAR |  | 
| equipo | edad | VARCHAR |  | 

### Promoción de conflictos escalares-escalares
<a name="connect-jdbc-autoschemagen-scalarconflictpromo"></a>

El siguiente diagrama muestra la forma en que se resuelven los conflictos entre tipos de datos escalares-escalares.

![\[Diagrama jerárquico en el que se muestra cómo se promoverán los tipos de datos en conflicto cuando no sean consistentes en los documentos.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/jdbc/scalar-scalar-promotion.png)


### Promoción de conflictos de tipo escalar complejo
<a name="connect-jdbc-autoschemagen-scalar-complex"></a>

Al igual que ocurre con los conflictos entre tipos escalares-escalares, un mismo campo en diferentes documentos puede tener tipos de datos conflictivos entre complejos (matriz y objeto) y escalares (enteros, booleanos, etc.). Todos estos conflictos se resuelven (se transfieren) a VARCHAR para esos campos. En este caso, los datos de matriz y objeto se devuelven como representación JSON.

Ejemplo de conflicto entre matriz incrustada y campo de cadena:

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

El ejemplo anterior se asigna al esquema de la tabla customer2: 


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| customer2 | Id customer2 | VARCHAR | PK | 
| customer2 | name | VARCHAR |  | 
| customer2 | Suscripción  | VARCHAR |  | 

y la tabla virtual customer1\$1subscriptions:


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| customer1\$1subscriptions | Id customer1 | VARCHAR | PK/FK | 
| customer1\$1subscriptions | suscriptions\$1index\$1lvl0 | BIGINT | PK | 
| customer1\$1subscriptions | valor | VARCHAR |  | 
| customer\$1address | ciudad | VARCHAR |  | 
| customer\$1address | región | VARCHAR |  | 
| customer\$1address | país | VARCHAR |  | 
| customer\$1address | código | VARCHAR |  | 

## Manejo de tipos de datos de objetos y matrices
<a name="connect-jdbc-autoschemagen-objectandarray"></a>

Hasta ahora, solo hemos descrito cómo se asignan los tipos de datos escalares. Los tipos de datos Object (objeto) y Array (matriz) están (actualmente) asignados a tablas virtuales. El controlador JDBC creará una tabla virtual para representar los campos de objeto o matriz de un documento. El nombre de la tabla virtual asignada concatenará el nombre de la colección original seguido del nombre del campo separado por un carácter de subrayado (“\$1”).

La clave principal de la tabla base (“\$1id”) adopta un nuevo nombre en la nueva tabla virtual y se proporciona como clave externa a la tabla base asociada.

En el caso de los campos de tipo matriz incrustados, las columnas de índice se generan para representar el índice de la matriz en cada nivel de la matriz.

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

En el caso de los campos de objetos de un documento, el controlador JDBC crea una asignación a una tabla virtual.

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

El ejemplo anterior se asigna al esquema de la tabla customer (cliente): 


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| cliente | Id del cliente | VARCHAR | PK | 
| cliente | name | VARCHAR |  | 

y la tabla virtual custome\$1address:


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| customer\$1address | Id del cliente | VARCHAR | PK/FK | 
| customer\$1address | dirección1 | VARCHAR |  | 
| customer\$1address | dirección2 | VARCHAR |  | 
| customer\$1address | ciudad | VARCHAR |  | 
| customer\$1address | región | VARCHAR |  | 
| customer\$1address | país | VARCHAR |  | 
| customer\$1address | código | VARCHAR |  | 

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

En el caso de los campos de objetos de un documento, el controlador JDBC crea una asignación a una tabla virtual.

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

El ejemplo anterior se asigna al esquema de la tabla customer1: 


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| customer1 | Id customer1 | VARCHAR | PK | 
| customer1 | name | VARCHAR |  | 

y la tabla virtual customer1\$1subscriptions:


| Nombre de la tabla | Nombre de la columna | Tipo de datos | Key | 
| --- | --- | --- | --- | 
| customer1\$1subscriptions | Id customer1 | VARCHAR | PK/FK | 
| customer1\$1subscriptions | suscriptions\$1index\$1lvl0 | BIGINT | PK | 
| customer1\$1subscriptions | valor | VARCHAR |  | 
| customer\$1address | ciudad | VARCHAR |  | 
| customer\$1address | región | VARCHAR |  | 
| customer\$1address | país | VARCHAR |  | 
| customer\$1address | código | VARCHAR |  | 

# Compatibilidad y limitaciones de SQL
<a name="connect-jdbc-sqlandlimits"></a>

El controlador JDBC de Amazon DocumentDB es un controlador de solo lectura que admite un subconjunto de SQL-92 y algunas extensiones comunes. Consulte la [documentación sobre las limitaciones de SQL](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/sql/sql-limitations.md) y de [JDBC para](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/jdbc/jdbc-limitations.md) obtener más información. 

# Resolución de problemas
<a name="connect-jdbc-troubleshooting"></a>

Si tiene problemas al utilizar el controlador JDBC de Amazon DocumentDB, consulte la [Guía de solución de problemas.](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/support/troubleshooting-guide.md) 

# Conexión mediante el controlador ODBC de Amazon DocumentDB
<a name="connect-odbc"></a>

El controlador ODBC para Amazon DocumentDB proporciona una interfaz relacional de SQL para los desarrolladores y permite la conectividad desde herramientas de BI como Power BI Desktop y Microsoft Excel.

Para obtener información más detallada, consulte la [Documentación del controlador ODBC de Amazon DocumentDB en GitHub.](https://github.com/aws/amazon-documentdb-jdbc-driver/blob/develop/src/markdown/index.md)

**Topics**
+ [Introducción](#connect-odbc-get-started)
+ [Configuración del controlador ODBC de Amazon DocumentDB en Windows](connect-odbc-setup-windows.md)
+ [Conexión a Amazon DocumentDB desde Microsoft Excel](connect-odbc-excel.md)
+ [Conexión a Amazon DocumentDB desde Power BI Desktop](connect-odbc-power-bi.md)
+ [Generación automática de esquemas](connect-odbc-schema.md)
+ [Compatibilidad y limitaciones de SQL](connect-odbc-sql-support.md)
+ [Solución de problemas](connect-odbc-troubleshooting.md)

## Introducción
<a name="connect-odbc-get-started"></a>

**Paso 1. Creación de clústeres de Amazon DocumentDB**  
Si todavía no tiene un clúster de Amazon DocumentDB, hay varias formas de empezar.  
Amazon DocumentDB es un servicio exclusivo de nube privada virtual (VPC). Si se conecta desde una máquina local externa a la VPC del clúster, necesitará crear una conexión SSH a una instancia de Amazon EC2. En este caso, inicie el clúster siguiendo las instrucciones de [Conexión con EC2](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.html). Consulte [Cómo usar un túnel SSH para conectarse a 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 obtener más información sobre los túneles SSH y cuándo podría necesitarlos.

**Paso 2. Instalación de JRE o JDK**  
En función de la aplicación de BI que utilice, puede que necesite instalar en su equipo una versión 8 o posterior de JRE o JDK de 64 bits. Puede descargar el Java SE Runtime Environment 8 [aquí](https://www.oracle.com/ca-en/java/technologies/downloads/#java8).

**Paso 3. Descarga del controlador ODBC de Amazon DocumentDB**  
Descargue el controlador ODBC de Amazon DocumentDB [aquí](https://github.com/aws/amazon-documentdb-odbc-driver/releases). Elija el instalador adecuado (por ejemplo, documentdb-odbc-1.0.0.msi). Siga la guía de instalación.

**Paso 4. Cómo usar un túnel SSH para conectarse a Amazon DocumentDB**  
Los clústeres de Amazon DocumentDB se implementan dentro de una Amazon Virtual Private Cloud (Amazon VPC). Se puede obtener acceso a ellos directamente mediante instancias de Amazon EC2 u otros servicios de AWS que se implementen en la misma Amazon VPC. Además, es posible obtener acceso a Amazon DocumentDB mediante instancias de Amazon EC2 u otros servicios de AWS en diferentes VPC de la misma región de AWS u otras regiones a través de la interconexión de VPC.  
Sin embargo, supongamos que su caso de uso requiere que usted o su aplicación tengan acceso a los recursos de Amazon DocumentDB desde fuera de la VPC del clúster. Este será el caso de la mayoría de los usuarios que no ejecuten su aplicación en una máquina virtual de la misma VPC que el clúster de Amazon DocumentDB. Si se conecta desde fuera de la VPC, puede utilizar la información sobre los túneles SSH (también conocida como reenvío de puertos) para acceder a los recursos de Amazon DocumentDB.  
Para crear un túnel SSH, necesita una instancia de Amazon EC2 que se ejecute en la misma VPC de Amazon que el clúster de Amazon DocumentDB. Puede usar una instancia EC2 existente en la misma VPC que el clúster o crear una. Si es así, puede configurar un túnel de SSH en el clúster de Amazon DocumentDB `sample-cluster.node.us-east-1.docdb.amazonaws.com` ejecutando el siguiente comando en su equipo 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
```
La marca `-L` se utiliza para el reenvío de un puerto local. Este es un requisito previo para conectarse a cualquier herramienta de BI que se ejecute en un cliente externo a su VPC. Una vez realizado el paso anterior, puede pasar a los siguientes con la herramienta de BI que prefiera.  
Para obtener más información sobre los túneles SSH, consulte la documentación sobre [Cómo usar un túnel SSH para conectarse a 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).

# Configuración del controlador ODBC de Amazon DocumentDB en Windows
<a name="connect-odbc-setup-windows"></a>

Utilice el siguiente procedimiento para configurar el controlador ODBC de Amazon DocumentDB en Windows:

1. Abra el **Panel de control** en Windows y busque ODBC (o, en el menú, seleccione **Herramientas de Windows** > **Fuentes de datos ODBC (32 bits)** o **Fuentes de datos ODBC (64 bits)**):  
![\[Interfaz del Panel de control de Windows que muestra los enlaces de configuración para orígenes de datos ODBC de 32 bits y 64 bits.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/odbc-control-panel-1.png)

1. Seleccione el administrador de origen de datos del controlador ODBC adecuado: elija la versión de 32 bits si está instalada; de lo contrario, elija la versión de 64 bits.

1. Seleccione la pestaña DSN del sistema y, a continuación, haga clic en **Agregar…** para agregar un nuevo DSN:  
![\[Interfaz del Administrador de origen de datos ODBC que muestra el botón Añadir.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/odbc-add-dsn-1.png)

1. Elija **Amazon DocumentDB** en la lista de controladores de origen de datos:  
![\[Interfaz de Crear nuevo origen de datos con la opción del controlador Amazon DocumentDB seleccionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/create-data-source-1.png)

1. En el cuadro de diálogo **Configurar DSN de Amazon DocumentDB**, complete los **Ajustes de conexión**, la pestaña **TLS** y los campos **Probar conexión** y, a continuación, haga clic en **Guardar**:  
![\[Interfaz de Configurar DSN de Amazon DocumentDB con los campos Configuración de conexión, TLS y Probar conexión. El botón Guardar está en la parte inferior.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/config-docdb-dsn-1.png)

1. Asegúrese de completar el formulario de Windows correctamente, ya que los detalles de la conexión variarán según el método de tunelización SSH que haya elegido para la instancia EC2. Consulte los métodos de tunelización SSH [aquí](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 [Sintaxis y opciones de la cadena de conexión](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/connection-string.md) para obtener más información sobre cada propiedad.  
![\[Interfaz de Configurar DSN de Amazon DocumentDB con los campos de Túnel SSH completados.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/config-docdb-dsn-ssh-1.png)

Para obtener más información sobre la configuración del controlador ODBC de Amazon DocumentDB en Windows, haga clic [aquí](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/setup/windows-dsn-configuration.md).

# Conexión a Amazon DocumentDB desde Microsoft Excel
<a name="connect-odbc-excel"></a>

1. Asegúrese de que el controlador Amazon DocumentDB se haya instalado y configurado correctamente. Para obtener información adicional, consulte [Configuración del controlador ODBC en Windows](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-odbc-setup-windows.html).

1. Abra Microsoft Excel.

1. Navegue hasta **Datos** > **Obtener datos** > **De otras fuentes**.

1. Elija **Desde ODBC**:  
![\[El menú desplegable Obtener datos muestra el submenú De otros orígenes. Se selecciona la opción Desde ODBC.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/excel-odbc-1.png)

1. Seleccione el origen de datos en el menú desplegable **Nombre del origen de datos (DSN)** asociado a Amazon DocumentDB:  
![\[El menú desplegable Nombre del origen de datos con la opción DSN de DocumentDB seleccionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/excel-odbc-dsn-select-1.png)

1. Elija la colección desde la que desea cargar datos en Excel:  
![\[Interfaz del Navegador con la tabla de salarios seleccionada y una vista previa de sus datos.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/excel-odbc-collect-1.png)

1. Cargar datos en Excel:  
![\[Hoja de cálculo de Excel que muestra cinco filas de datos de la tabla de salarios seleccionada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/excel-data-load-1.png)

# Conexión a Amazon DocumentDB desde Power BI Desktop
<a name="connect-odbc-power-bi"></a>

**Topics**
+ [Requisitos previos](#odbc-power-bi-prerequisites)
+ [Cómo añadir un conector personalizado de Microsoft Power BI Desktop](#odbc-adding-power-bi)
+ [Conexión mediante el conector personalizado de Amazon DocumentDB](#odbc-connect-custom-connector)
+ [Configuración de la puerta de enlace Power BI de Microsoft](#odbc-power-bi-gw)

## Requisitos previos
<a name="odbc-power-bi-prerequisites"></a>

Antes de empezar, asegúrese de que el controlador ODBC de Amazon DocumentDB esté instalado correctamente.

## Cómo añadir un conector personalizado de Microsoft Power BI Desktop
<a name="odbc-adding-power-bi"></a>

Copie el archivo `AmazonDocumentDBConnector.mez` en la carpeta `<User>\Documents\Power BI Desktop\Custom Connectors\` (o `<User>\OneDrive\Documents\Power BI Desktop\Custom Connectors` si usa OneDrive). Esto permitirá a Power BI acceder al conector personalizado. Puede obtener el conector a Power BI Desktop [aquí](https://github.com/aws/amazon-documentdb-odbc-driver/releases). Reinicie Power BI Desktop para asegurarse de que el conector esté cargado.

**nota**  
El conector personalizado solo admite el nombre de usuario y la contraseña de Amazon DocumentDB para la autenticación.

## Conexión mediante el conector personalizado de Amazon DocumentDB
<a name="odbc-connect-custom-connector"></a>

1. Seleccione Amazon DocumentDB (Beta) en **Obtener datos** y haga clic en **Conectar**. Si recibe una advertencia por usar un servicio de terceros, haga clic en **Continuar**.  
![\[Interfaz de Obtener datos con la opción Amazon DocumentDB (Beta) resaltada.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/get-data-1.png)

1. Introduzca toda la información necesaria para conectarse a su clúster de Amazon DocumentDB y, a continuación, haga clic en **Aceptar**:  
![\[Formulario con campos de entrada de detalles de conexión para un clúster de Amazon DocumentDB.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/docdb-form-1.png)
**nota**  
Según la configuración del nombre del origen de datos (DSN) del controlador ODBC, es posible que la pantalla de detalles de la conexión SSH no aparezca si ya ha proporcionado la información necesaria en la configuración del DSN.

1. Seleccione el modo de conectividad de datos:
   + **Importación**: carga todos los datos y almacena la información en el disco. Los datos deben actualizarse y volver a cargarse para que se muestren las actualizaciones de datos.
   + **Consulta directa**: no carga datos, pero realiza consultas en tiempo real sobre los datos. Esto significa que no es necesario actualizar ni volver a cargar los datos para mostrar las actualizaciones de los datos.  
![\[Interfaz que muestra las opciones del modo de conectividad de datos para DocumentDB.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/data-connectivity-1.png)
**nota**  
Si utiliza un conjunto de datos muy grande, es posible que la importación de todos los datos tarde más tiempo.

1. Si es la primera vez que se conecta a este origen de datos, seleccione el tipo de autenticación e introduzca sus credenciales cuando así se le pida. A continuación, haga clic en **Conectar**:  
![\[Interfaz de Autenticación que muestra los campos de entrada para las credenciales de nombre de usuario y contraseña.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/docdb-credentials-1.png)

1. En el cuadro de diálogo **Navegador**, seleccione las tablas de base de datos que desee y, a continuación, haga clic en **Cargar** para cargar los datos o en **Transformar datos** para continuar con la transformación de los datos.  
![\[Interfaz del Navegador que muestra una lista de tablas de bases de datos entre las que elegir. Los botones Cargar y Transformar datos se encuentran en la parte inferior derecha.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/navigator-1.png)
**nota**  
La configuración del origen de datos se guarda una vez que se conecta. Para modificarlos, seleccione **Transformar datos** > **Configuración del origen de datos**.

## Configuración de la puerta de enlace Power BI de Microsoft
<a name="odbc-power-bi-gw"></a>

**Requisitos previos**:
+ Asegúrese de que el conector personalizado funcione con la puerta de enlace Power BI.
+ Asegúrese de que el DSN de ODBC esté creado en el origen de datos de ODBC en la pestaña **Sistema** de la máquina en la que está instalada la puerta de enlace Power BI.

Si utiliza la característica de túnel SSH interno, el archivo `known_hosts` debe estar ubicado en un lugar donde la cuenta de servicio de Power BI tenga acceso a él.

![\[Interfaz de propiedades known_hosts que muestra los permisos para el PBIEGWService.\]](http://docs.aws.amazon.com/es_es/documentdb/latest/developerguide/images/ssh-known-hosts-1.png)


**nota**  
Esto también se aplica a cualquier archivo que necesite para poder establecer una conexión con su clúster de Amazon DocumentDB, como un archivo de certificado (archivo pem) de una autoridad de certificación (CA). 

# Generación automática de esquemas
<a name="connect-odbc-schema"></a>

El controlador ODBC utiliza el controlador JDBC de Amazon DocumentDB a través de JNI (interfaz nativa de Java), lo que hace que la característica de generación automática de esquemas funcione de manera similar en el controlador JDBC. Para obtener más información sobre la generación automática de esquemas, consulte [Generación automática de esquemas JDBC](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-jdbc-autoschemagen.html). Además, para obtener más información sobre la arquitectura del controlador ODBC, haga clic [aquí](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/index.md).

# Compatibilidad y limitaciones de SQL
<a name="connect-odbc-sql-support"></a>

El controlador ODBC de Amazon DocumentDB es un controlador de solo lectura que es compatible con un subconjunto de SQL-92 y algunas extensiones comunes. Consulte la documentación de [Compatibilidad y limitaciones de ODBC](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/support/odbc-support-and-limitations.md) para obtener más información.

# Solución de problemas
<a name="connect-odbc-troubleshooting"></a>

Si tiene problemas al utilizar el controlador ODBC de Amazon DocumentDB, consulte la [Guía de solución de problemas.](https://github.com/aws/amazon-documentdb-odbc-driver/blob/develop/src/markdown/support/troubleshooting-guide.md)

# Programación con Amazon DocumentDB
<a name="program-docdb"></a>

El servicio admite la validación de esquemas JSON.

**Topics**
+ [Guía de programación de DocumentDB en Java](docdb-java-pg.md)
+ [Cómo utilizar la validación de esquemas JSON](json-schema-validation.md)

# Guía de programación de Amazon DocumentDB en Java
<a name="docdb-java-pg"></a>

Esta guía completa proporciona una guía detallada para trabajar con Amazon DocumentDB mediante los controladores Java de MongoDB y abarca aspectos esenciales de las operaciones y la administración de bases de datos.

**Topics**
+ [Introducción](#java-pg-intro)
+ [Requisitos previos](#java-pg-prereqs)
+ [Modelo de datos](#java-pg-data-models)
+ [Conexión con un controlador Java](java-pg-connect-mongo-driver.md)
+ [Operaciones CRUD con Java](java-crud-operations.md)
+ [Administración de índices con Java](index-management-java.md)
+ [Programación basada en eventos](event-driven-programming.md)

## Introducción
<a name="java-pg-intro"></a>

La guía comienza con la conectividad y explica cómo establecer conexiones seguras a los clústeres de DocumentDB mediante el controlador Java de MongoDB. Detalla los componentes de la cadena de conexión, SSL/TLS la implementación y las diversas opciones de conexión, incluida la autenticación de IAM y la agrupación de conexiones, junto con estrategias sólidas de gestión de errores.

En la sección de operaciones CRUD (crear, leer, actualizar, eliminar) de la guía, se trata exhaustivamente la manipulación de documentos y muestra cómo crear, leer, actualizar y eliminar documentos mediante operaciones únicas o masivas. Se explica el uso de filtros, consultas y diversas opciones de operación, al tiempo que se hace hincapié en las mejores prácticas para la gestión de errores y la implementación de la lógica de reintento para mejorar la fiabilidad. La guía también cubre ampliamente la gestión de índices y detalla la creación y el mantenimiento de diferentes tipos de índices, incluidos los índices de un solo campo, compuestos, dispersos y de texto. Se explica cómo optimizar el rendimiento de las consultas mediante una selección adecuada de los índices y el uso de la función `explain()` para analizar los planes de ejecución de consultas.

La última sección se centra en la programación basada en eventos mediante los flujos de cambios de Amazon DocumentDB y demuestra cómo implementar la supervisión de cambios de datos en tiempo real en aplicaciones Java. Abarca la implementación de cursores de flujo de cambios, la gestión de los tokens de reanudación para un funcionamiento continuo y las operaciones basadas en el tiempo para el procesamiento de datos históricos. A lo largo de la guía, se proporcionan ejemplos de código prácticos y prácticas recomendadas, lo que la convierte en un recurso inestimable para crear aplicaciones sólidas en Java con Amazon DocumentDB.

## Requisitos previos
<a name="java-pg-prereqs"></a>

Antes de empezar, asegúrese de que tiene lo siguiente:
+ Una AWS cuenta con un clúster de DocumentDB configurado. Consulte esta [entrada del blog de introducción](https://aws.amazon.com/blogs/database/part-1-getting-started-with-amazon-documentdb-using-amazon-ec2/) para obtener información sobre la configuración del clúster de DocumentDB.
+ El kit de desarrollo de Java (JDK) está instalado (utilizaremos [Amazon Corretto 21](https://docs.aws.amazon.com/corretto/latest/corretto-21-ug/downloads-list.html) para esta guía).
+ Maven para la administración de dependencias.

## Modelos de datos para esta guía
<a name="java-pg-data-models"></a>

Todo el código de ejemplo de esta guía presupone una conexión a una base de datos de prueba «ProgGuideData» que tiene la colección «Restaurantes». Todos los códigos de muestra de esta guía funcionan en un sistema de listas de restaurantes y, a continuación, se muestra un ejemplo del aspecto de un documento de este 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
    }
}
```

Todos los ejemplos de código que muestran las operaciones CRUD, la gestión de índices y la programación basada en eventos suponen que tiene un `dbClient` objeto de [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), una `connectionDB` objeto de [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) y una `collection` objeto de [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()).

**nota**  
Todos los ejemplos de código de esta guía se han probado con el controlador Java de MongoDB, versión 5.3.0.

# Conexión a Amazon DocumentDB con un controlador Java de MongoDB
<a name="java-pg-connect-mongo-driver"></a>

En esta sección se proporciona una step-by-step guía para conectarse a Amazon DocumentDB mediante controladores Java. Esto le permitirá empezar a integrar DocumentDB en sus aplicaciones Java.

**Topics**
+ [Paso 1: Configuración del proyecto](#step1-set-up)
+ [Paso 2: crear una cadena de conexión](#step2-create-connection-string)
+ [Paso 3: escribir el código de conexión](#step3-write-connect-code)
+ [Paso 4: gestionar excepciones de conexión](#step4-handle-connect-exceptions)
+ [Paso 5: ejecutar el código](#step5-running-code)
+ [Prácticas recomendadas de conexión](#java-connect-best-practices)

## Paso 1: Configuración del proyecto
<a name="step1-set-up"></a>

1. Cree un proyecto java con Maven:

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

1. Añada el controlador Java de MongoDB como una dependencia para el proyecto en su archivo «pom.xml»:

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

## Paso 2: crear una cadena de conexión
<a name="step2-create-connection-string"></a>

La cadena de conexión de Amazon DocumentDB es esencial para establecer una conexión entre la aplicación y el clúster de DocumentDB. Esta cadena encapsula información crucial, como el punto de conexión del clúster, el puerto, los detalles de autenticación y varias opciones de conexión. Para crear una cadena de conexión de DocumentDB, normalmente se empieza con el formato básico:

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

Deberá sustituir los términos «nombre de usuario» y «contraseña» por sus credenciales reales. Puede encontrar el punto final y el número de puerto de su clúster Consola de administración de AWS tanto en el AWS CLI. Consulte [Búsqueda de puntos de conexión de un clúster](db-cluster-endpoints-find.md) para encontrar el punto de conexión del clúster. El puerto 27017 es el puerto predeterminado de DocumentDB.

**Ejemplos de cadenas de conexión**
+ Para establecer una conexión a DocumentDB mediante cifrado en tránsito y asegurarse de que las solicitudes de lectura vayan a las réplicas de lectura y escriban a la principal:

  ```
  "mongodb://username:password@cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false"
  ```
+ Para establecer una conexión a DocumentDB mediante la autenticación de IAM:

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

Las diferentes opciones disponibles para la cadena de conexión son las siguientes:
+ [Certificado TLS](#connection-string-tls)
+ [Lectura a partir de réplicas de lectura](#connection-string-read-rep)
+ [Write concern y registro en diario](#connection-string-write-journal)
+ [RetryWrites](#connection-string-retry-writes)
+ [Autenticación de IAM](#connection-string-iam-auth)
+ [Grupo de conexiones](#connection-string-pool)
+ [Parámetros de tiempo de espera de conexión](#connection-string-timeout)

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

**`tls=true|false`**: esta opción habilita o deshabilita la seguridad de la capa de transporte (TLS). De forma predeterminada, el cifrado en tránsito está habilitado en el clúster de Amazon DocumentDB y, por lo tanto, a menos que TLS esté deshabilitada en el nivel del clúster, el valor de esta opción debería ser `true`.

Cuando se utiliza TLS, el código debe proporcionar un certificado SSL cuando crea la conexión a un clúster de DocumentDB. Descargue el certificado necesario para realizar la conexión segura al clúster: [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem). Hay dos formas de usar el archivo `global-bundle.pem`.
+ **Opción 1**: extraer todos los certificados del archivo `global-bundle.pem` y usar la herramienta clave de Java para almacenarlos en un archivo `.jks` que luego se pueda usar en el código. Consulte la pestaña Java en [Conexión con TLS habilitado](connect_programmatically.md#connect_programmatically-tls_enabled) para ver el script que muestra cómo hacerlo.
+ **Opción 2**: añadir dinámicamente el archivo `global-bundle.pem` al código, crear un almacén de claves en memoria y usar `SSLContext` para proporcionar el certificado como parte de la conexión.

### Lectura a partir de réplicas de lectura
<a name="connection-string-read-rep"></a>

**`replicaSet=rs0&readPreference=secondaryPreferred`**: si se especifican estas dos opciones, se redirigen todas las solicitudes de lectura a las réplicas de lectura y las solicitudes de escritura a la instancia principal. El uso de `replicaSet=rs0` en la cadena de conexión permite que el controlador MongoDB mantenga una vista actualizada automáticamente de la topología del clúster, lo que permite que las aplicaciones mantengan la visibilidad de las configuraciones de nodos actuales a medida que se añaden o eliminan instancias. Si no se proporcionan estas opciones ni se especifica `readPreference=primary`, se envían todas las lecturas y escrituras a la instancia principal. Para obtener más opciones de `readPreference`, consulte [Opciones de preferencia de lectura](how-it-works.md#durability-consistency-isolation).

### Write concern y registro en diario
<a name="connection-string-write-journal"></a>

La opción Write concern determina el nivel de reconocimiento solicitado a la base de datos para las operaciones de escritura. Los controladores MongoDB ofrecen una opción para ajustar los archivos de Write concern y de diario. Amazon DocumentDB no espera que establezca la opción de Write concern y diario, e ignora los valores enviados para `w` y `j` (`writeConcern` y `journal`). DocumentDB siempre escribe datos con `writeConcern`: `majority` y`journal`: `true` de modo que las escrituras se registren de forma duradera en la gran mayoría de los nodos antes de enviar una confirmación al cliente.

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

**`retryWrites=false`**: DocumentDB no admite reintentos de escritura y, por lo tanto, este atributo siempre debe estar establecido en `false`.

### Autenticación de IAM
<a name="connection-string-iam-auth"></a>

**`authSource=%24external`y `authMechanism=MONGODB-AWS`**: estos dos parámetros se utilizan para autenticarse mediante AWS Identity and Access Management. En la actualidad, la autenticación de IAM está disponible solamente en la versión 5.0 del clúster basado en instancias. Para obtener más información, consulte [Autenticación mediante la identidad de IAM](iam-identity-auth.md).

### Grupo de conexiones
<a name="connection-string-pool"></a>

Estas opciones están disponibles para la agrupación de conexiones:
+ **`maxPoolSize`**: establece el número máximo de conexiones que se pueden crear en el grupo. Cuando todas las conexiones están en uso y llega una nueva solicitud, espera a que haya una conexión disponible. El valor predeterminado para los controladores Java de MongoDB es 100.
+ **`minPoolSize`**: indica el número mínimo de conexiones que deben mantenerse en el grupo en todo momento. El valor predeterminado para los controladores Java de MongoDB es 0.
+ **`maxIdleTimeMS`**: determina cuánto tiempo puede permanecer inactiva una conexión en el grupo antes de cerrarla y eliminarla. El valor predeterminado para los controladores Java de MongoDB es 100 milisegundos.
+ **`waitQueueTimeoutMS`**: configura cuánto tiempo debe esperar un subproceso para que una conexión esté disponible cuando el grupo esté en su tamaño máximo. Si una conexión no está disponible en este tiempo, se produce una excepción. El valor predeterminado para los controladores Java de MongoDB es 120 000 milisegundos (2 minutos).

### Parámetros de tiempo de espera de conexión
<a name="connection-string-timeout"></a>

El tiempo de espera es un mecanismo para limitar el tiempo que puede tardar una operación o un intento de conexión antes de que se considere fallido. Los siguientes parámetros de tiempo de espera están disponibles para evitar esperas indefinidas y administrar la asignación de recursos:
+ **`connectTimeoutMS`**: configura cuánto tiempo esperará el controlador para establecer una conexión con el clúster. El valor predeterminado es de 10 000 milisegundos (10 segundos).
+ **`socketTimeoutMS`**: especifica cuánto tiempo esperará el controlador para recibir una respuesta del servidor para una operación que no sea de escritura. El valor predeterminado es 0 (sin tiempo de espera o es infinito).
+ **`serverSelectionTimeoutMS`**: especifica cuánto tiempo esperará el controlador para encontrar un servidor disponible en el clúster. El valor predeterminado de esta configuración es de 30 segundos y es suficiente para que se elija una nueva instancia principal durante la conmutación por error.

## Paso 3: escribir el código de conexión
<a name="step3-write-connect-code"></a>

En el siguiente ejemplo de código se muestra cómo establecer una conexión de TLS a Amazon DocumentDB:
+ Crea los objetos [https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html](https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html) y [`SSLContext`>](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLContext.html) de Java.
+ También crea el 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) pasándolo al 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 establecer una conexión TLS, debe usar el objeto `MongoClientSettings` para vincular la `connectionstring` y el `sslcontext`.
+ El 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) obtiene un 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);
    }
}
```

## Paso 4: gestionar excepciones de conexión
<a name="step4-handle-connect-exceptions"></a>

Cuando se trabaja con DocumentDB en aplicaciones Java, el manejo de las excepciones de conexión es crucial para mantener operaciones de base de datos sólidas y fiables. Si se gestionan adecuadamente, estas excepciones no solo ayudan a diagnosticar los problemas rápidamente, sino que también garantizan que la aplicación pueda gestionar sin problemas las interrupciones temporales de la red o la falta de disponibilidad del servidor, lo que mejora la estabilidad y la experiencia del usuario. Algunas de las excepciones más importantes relacionadas con el establecimiento de la conexión son las siguientes:
+ **`MongoException`**: es una excepción general y podría emitirse en varias situaciones no cubiertas por excepciones más específicas. Asegúrese de que esta excepción se gestione después de todas las demás excepciones específicas, ya que se trata de una excepción general de MongoDB.
+ **`MongoTimeoutException`**: se emite cuando se agota el tiempo de espera de una operación. Por ejemplo, cuando consulta un punto de conexión de un clúster que no existe.
+ **`MongoSocketException`**: se emite por problemas relacionados con la red. Por ejemplo, una desconexión repentina de la red durante una operación. 
+ **`MongoSecurityException`**: se emite cuando se produce un error en la autenticación. Por ejemplo, cuando se intenta conectar con credenciales incorrectas. 
+ **`MongoConfigurationException`**: se emite cuando hay un error en la configuración del cliente. Por ejemplo, si se utiliza una cadena de conexión no válida.

## Paso 5: ejecutar el código
<a name="step5-running-code"></a>

El siguiente ejemplo de código crea una conexión a Amazon DocumentDB e imprime todas las bases de datos:

```
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ácticas recomendadas de conexión
<a name="java-connect-best-practices"></a>

Las siguientes son prácticas recomendadas que se deben tener en cuenta cuando se conecta a Amazon DocumentDB con un controlador Java de MongoDB:
+ Cierre siempre el [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) cuando ya no necesite que el cliente libere recursos.
+ Gestione las excepciones de forma adecuada e implemente un registro de errores adecuado.
+ Utilice variables de entorno o AWS Secrets Manager almacene información confidencial, como nombres de usuario y contraseñas.

# Realización de operaciones CRUD en Amazon DocumentDB con Java
<a name="java-crud-operations"></a>

En esta sección se describe cómo realizar las operaciones CRUD (crear, leer, actualizar, eliminar) en Amazon DocumentDB con los controladores Java de MongoDB.

**Topics**
+ [Creación e inserción de documentos en una colección de DocumentDB](#creating-inserting)
+ [Lectura y recuperación de datos de una colección de DocumentDB](#reading-retrieving)
+ [Actualización de documentos existentes en una colección de DocumentDB](#updating-documents)
+ [Eliminación de documentos de una colección de DocumentDB](#deleting-documents)
+ [Gestión de errores con lógica de reintento](#error-handling)

## Creación e inserción de documentos en una colección de DocumentDB
<a name="creating-inserting"></a>

La inserción de documentos en Amazon DocumentDB le permite añadir nuevos datos a sus colecciones. Existen varias formas de realizar las inserciones, en función de sus necesidades y del volumen de datos con el que esté trabajando. El método más básico para insertar un documento individual en la colección es `insertOne()`. Para insertar varios documentos a la vez, puede utilizar el método de `insertMany()`, que le permite añadir una serie de documentos en una sola operación. Otro método para insertar muchos documentos en una colección de DocumentDB es `bulkWrite()`. En esta guía, analizamos todos estos métodos para crear documentos en una colección de DocumentDB.

**`insertOne()`**

Empecemos por examinar cómo insertar un documento individual en una colección de Amazon DocumentDB. La inserción de un único documento se realiza mediante el método `insertOne()`. Este método toma un objeto [BsonDocument](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/bson/org/bson/BsonDocument.html)para insertarlo y devuelve un [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 se puede utilizar para obtener el identificador de objeto del nuevo documento insertado. El siguiente código de ejemplo muestra la inserción de un documento de restaurante en la colección:

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

Cuando use `insertOne()`, asegúrese de incluir una gestión de errores adecuada. Por ejemplo, en el código anterior, «`restaurantId`» tiene un índice único y, por lo tanto, cuando vuelva a ejecutar este código, se generará la siguiente `MongoWriteException`:

```
Failed to insert document: Write operation error on server docdbCluster.docdb.amazonaws.com:27017. 
Write error: WriteError{code=11000, message='E11000 duplicate key error collection: Restaurants index: restaurantId_1', details={}}.
```

**InsertMany()**

Los métodos principales utilizados para insertar muchos documentos en una colección son insertMany() y `bulkWrite()`. 

El método `insertMany()` es la forma más sencilla de insertar varios documentos en una sola operación. Acepta una lista de documentos y los inserta en la colección. Este método es ideal cuando se inserta un lote de documentos nuevos que son independientes entre sí y no requieren ningún procesamiento especial ni operaciones mixtas. El siguiente código muestra la lectura de documentos JSON de un archivo y su inserción en la colección. La `insertMany()` función devuelve un [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 se puede utilizar para obtener todos IDs los documentos insertados.

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

El método `bulkWrite()` permite realizar múltiples operaciones de escritura (insertar, actualizar, eliminar) en un solo lote. Puede usar `bulkWrite()` cuando necesite realizar diferentes tipos de operaciones en un solo lote, como insertar algunos documentos y actualizar otros. `bulkWrite()` admite dos tipos de escritura por lotes, ordenada y desordenada:
+ *Operaciones ordenadas* (predeterminado): Amazon DocumentDB procesa las operaciones de escritura de forma secuencial y se detiene ante el primer error que detecta. Esto resulta útil cuando el orden de las operaciones es importante, por ejemplo, cuando las operaciones posteriores dependen de las anteriores. Sin embargo, las operaciones ordenadas suelen ser más lentas que las desordenadas. En el caso de las operaciones ordenadas, debe abordar el caso de que el lote se detenga ante el primer error, lo que podría dejar algunas operaciones sin procesar.
+ *Operaciones desordenadas*: permite a Amazon DocumentDB procesar las inserciones como una sola ejecución en la base de datos. Si se produce un error en un documento, la operación continúa con el resto de los documentos. Esto resulta especialmente útil cuando se insertan grandes cantidades de datos y se pueden tolerar algunos errores, como durante la migración de datos o las importaciones masivas, donde algunos documentos pueden fallar debido a la duplicación de claves. En el caso de operaciones desordenadas, debe abordar las situaciones de éxito parcial, en los que algunas operaciones se realizan correctamente y otras no.

Al trabajar con el método `bulkWrite()`, se requieren algunas clases esenciales. En primer lugar, la clase [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) sirve como clase base para todas las operaciones de escritura y tiene implementaciones 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) y [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), que manejan diferentes tipos de operaciones.

La [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)clase es necesaria para configurar el comportamiento de las operaciones masivas, como configurar la ordered/unordered ejecución o omitir la validación de los documentos. La clase [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) proporciona información detallada sobre los resultados de la ejecución, incluidos los recuentos de documentos insertados, actualizados y eliminados.

Para la gestión de errores, la clase [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) es fundamental, ya que contiene información sobre los posibles errores que se produzcan durante la operación masiva, mientras que la clase [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) proporciona detalles específicos sobre los errores de las operaciones individuales. El siguiente código muestra un ejemplo de inserción de una lista de documentos, así como de actualización y eliminación de un solo documento, todo ello mediante la ejecución de una llamada a un único método `bulkWrite()`. El código también muestra cómo trabajar con [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) y [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), así como la correcta gestión de errores de la operación de `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());
}
```

**Escrituras reintentables**

A diferencia de MongoDB, Amazon DocumentDB no admite el reintento de las escrituras. En consecuencia, debe implementar una lógica de reintento personalizada en sus aplicaciones, especialmente para solucionar problemas de red o la falta temporal de disponibilidad del servicio. Por lo general, una estrategia de reintentos bien implementada implica aumentar la demora entre los reintentos y limitar el número total de reintentos. Consulte [Gestión de errores con lógica de reintento](#error-handling) a continuación para conocer un ejemplo de código sobre cómo crear una lógica de reintentos con gestión de errores.

## Lectura y recuperación de datos de una colección de DocumentDB
<a name="reading-retrieving"></a>

La consulta de documentos en Amazon DocumentDB gira en torno a varios componentes clave que permiten recuperar y manipular datos con precisión. El [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 es la consulta fundamental APIs en los controladores Java de MongoDB. Permite la recuperación de datos complejos con numerosas opciones para filtrar, ordenar y proyectar resultados. Además del 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) y [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) son otros dos componentes fundamentales que proporcionan los componentes básicos para las operaciones de consulta en los controladores Java de MongoDB.

La clase `Filters` es una clase de utilidad del controlador Java de MongoDB que proporciona una API fluida para generar un constructo de filtros de consultas. Esta clase ofrece métodos de fábrica estáticos que crean instancias de objetos `Bson` que representan diversas condiciones de consulta. Los métodos más comúnmente utilizados son `eq()` para las comparaciones de igualdad, `gt()`, `lt()`, `gte()` y `lte()` para las comparaciones numéricas, `and()` y `or()` para las combinaciones de condiciones múltiples, `in()` y `nin()` para las pruebas de suscripción a matrices y `regex()` para la coincidencia de patrones. La clase está diseñada para ser segura en relación con los tipos y proporciona una mejor comprobación en tiempo de compilación en comparación con las consultas basadas en documentos sin procesar, lo que la convierte en el enfoque preferido para crear consultas de DocumentDB en aplicaciones Java. La gestión de errores es sólida, con claras excepciones en el caso de constructos de filtros no válidas.

`FindIterable` es una interfaz especializada diseñada para gestionar el resultado del método `find()`. Proporciona un amplio conjunto de métodos para refinar y controlar la ejecución de consultas, y ofrece una API fluida para el encadenamiento de métodos. La interfaz incluye métodos esenciales de modificación de consultas, como `limit()` para restringir el número de documentos devueltos, `skip()` para paginar, `sort()` para ordenar los resultados, `projection()` para seleccionar campos específicos y `hint()` para seleccionar índices. Las operaciones de agrupar en lotes, omitir y limitar en `FindIterable` son herramientas esenciales de paginación y administración de datos que ayudan a controlar la forma en que se recuperan y procesan los documentos de la base de datos.

Agrupar en lotes (`batchSize`) controla el número de documentos que DocumentDB devuelve al cliente en una única red de ida y vuelta. Cuando establece un tamaño de lote, DocumentDB no devuelve todos los documentos coincidentes a la vez, sino que los devuelve en grupos del tamaño de lote especificado. 

Omitir le permite desplazar el punto de partida de los resultados y, básicamente, le indica a DocumentDB que omita un número específico de documentos antes de empezar a devolver las coincidencias. Por ejemplo, `skip(20)` omitirá los primeros 20 documentos coincidentes. Esto se suele utilizar en situaciones de paginación en los que se desean recuperar páginas de resultados posteriores. 

Limitar restringe el número total de documentos que se pueden devolver a partir de una consulta. Si especifica `limit(n)`, DocumentDB dejará de devolver documentos después de haber devuelto «n» documentos, incluso si hay más coincidencias en la base de datos. 

`FindIterable` admite patrones de iterador y cursor cuando recupera documentos de Amazon DocumentDB. La ventaja de usar `FindIterable` como iterador es que permite la carga diferida de los documentos y solo los recupera cuando la aplicación los solicita. Otra ventaja de usar el iterador es que no es responsable de mantener la conexión con el clúster y, por lo tanto, no es necesario cerrar la conexión de forma explícita. 

`FindIterable` también proporciona soporte para [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 utilizar patrones de cursor cuando trabaja con consultas de Amazon DocumentDB. El `MongoCursor` es una implementación específica del controlador Java de MongoDB que proporciona control sobre las operaciones de la base de datos y la administración de recursos. Implementa la `AutoCloseable` interfaz, lo que permite una gestión explícita de los recursos mediante try-with-resources bloques, lo cual es crucial para cerrar correctamente las conexiones de las bases de datos y liberar los recursos del servidor. De forma predeterminada, el tiempo de espera del cursor es de 10 minutos y DocumentDB no le da la opción de cambiar este comportamiento de tiempo de espera. Cuando trabaje con datos agrupados, asegúrese de recuperar el siguiente lote de datos antes de que se agote el tiempo de espera del cursor. Una consideración clave a la hora de usar el `MongoCursor` es que requiere un cierre explícito para evitar la pérdida de recursos.

En esta sección, se presentan varios ejemplos de `find()`, `Filters` y `FindIterable`.

En el siguiente ejemplo de código se muestra cómo usar `find()` para recuperar un solo documento con su campo «restaurantId»:

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

Si bien el uso de `Filters` permite comprobar mejor los errores en el momento de la compilación, el controlador java también permite especificar un filtro de `Bson` directamente en el método `find()`. El siguiente código de ejemplo pasa el documento `Bson` a `find()`:

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

El siguiente código de ejemplo muestra varios ejemplos del uso de la clase `Filters` con `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));
```

En el siguiente ejemplo se muestra cómo encadenar las operaciones de `sort()`, `skip()`, `limit()` y `batchSize()` en un objeto de `FindIterable`. El orden en que se proporcionen estas operaciones influirá en el rendimiento de la consulta. Como práctica recomendada, el orden de estas operaciones debe ser `sort()`, `projection()`, `skip()`, `limit()` y `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);
```

El siguiente ejemplo de código muestra cómo crear un iterador en `FindIterable`. Usa el constructo `forEach` de Java para recorrer el conjunto de resultados.

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

En el último ejemplo de código de `find()`, se muestra cómo usar el `cursor()` para la recuperación de documentos. Crea el cursor en el bloque de prueba, lo que garantiza que el cursor se cierre cuando el código salga del bloque de prueba.

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

## Actualización de documentos existentes en una colección de DocumentDB
<a name="updating-documents"></a>

Amazon DocumentDB proporciona mecanismos flexibles y potentes para modificar los documentos existentes e insertar otros nuevos cuando no existen. El controlador Java de MongoDB ofrece varios métodos de actualización: `updateOne()` para actualizaciones de un solo documento, `updateMany()` para actualizaciones de varios documentos y `replaceOne()` para la sustitución completa de documentos. Además de estos tres 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) y [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) son otros componentes fundamentales que proporcionan los componentes básicos para las operaciones de actualización en los controladores Java de MongoDB. 

La clase `Updates` del controlador Java de MongoDB es una clase de utilidad que proporciona métodos de fábrica estáticos para crear operadores de actualización. Sirve como el compilador principal para crear operaciones de actualización de forma legible y segura. Métodos básicos como `set()`, `unset()` y `inc()` permiten la modificación directa de los documentos. El poder de esta clase se hace evidente cuando se combinan varias operaciones mediante el método `Updates.combine()`, que permite ejecutar varias operaciones de actualización de forma atómica, lo que garantiza la coherencia de datos.

`UpdateOptions` es una potente clase de configuración del controlador Java de MongoDB que proporciona capacidades de personalización esenciales para las operaciones de actualización de documentos. Dos aspectos importantes de esta clase son la compatibilidad con actualizaciones y filtros de matriz para las operaciones de actualización. La característica de actualización, habilitada mediante `upsert(true)`, permite crear nuevos documentos cuando no se encuentra ningún documento coincidente durante una operación de actualización. Mediante `arrayFilters()`, la operación de actualización puede actualizar con precisión los elementos de la matriz que cumplan criterios específicos.

`UpdateResult` en el controlador Java de MongoDB proporciona el mecanismo de retroalimentación que detalla el resultado de una operación de actualización. Esta clase agrupa tres métricas clave: el número de documentos que cumplen los criterios de actualización (`matchedCount`), el número de documentos realmente modificados (`modifiedCount`) y la información sobre cualquier documento alterado (`upsertedId`). Comprender estas métricas es esencial para gestionar correctamente los errores, verificar las operaciones de actualización y mantener la coherencia de datos en las aplicaciones.

### Actualización y sustitución de un solo documento
<a name="update-single-doc"></a>

En DocumentDB, la actualización de un solo documento se puede realizar mediante el método updateOne(). Este método utiliza un parámetro de filtro, normalmente proporcionado por la clase `Filters`, para identificar el documento que se va a actualizar, un parámetro de `Updat` que determina qué campos se van a actualizar y un parámetro de `UpdateOptions` opcional para establecer diferentes opciones de actualización. El uso del método `updateOne()` solo actualizará el primer documento que coincida con los criterios de selección. El siguiente código de ejemplo actualiza un solo campo de un documento:

```
collection.updateOne(Filters.eq("restaurantId", "REST-Y2E9H5"),
    Updates.set("name", "Amazing Japanese sushi"));
```

Para actualizar varios campos de un documento, use `updateOne()` con `Update.combine()` como se muestra en el siguiente ejemplo. En este ejemplo también se muestra cómo agregar un elemento a una matriz del 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);
```

En el siguiente ejemplo de código se muestra cómo actualizar un documento de la base de datos. Si el documento especificado no existe, la operación lo insertará automáticamente como documento nuevo. Este código también muestra cómo utilizar las métricas disponibles a través del objeto de `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)");
}
```

El siguiente ejemplo de código muestra cómo reemplazar completamente un documento existente por uno nuevo mediante el método `replaceOne()`, en lugar de actualizar campos individuales. El método `replaceOne()` sobrescribe todo el documento y conserva únicamente el campo `_id` del original. Si varios documentos coinciden con los criterios del filtro, solo se reemplaza el primer documento encontrado.

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

### Actualización de documentos múltiples
<a name="update-multiple-docs"></a>

Hay dos formas de actualizar varios documentos de una colección de forma simultánea. Puede utilizar el método de `updateMany()` o usar el [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) con el método `bulkWrite()`. El método `updateMany()` utiliza un parámetro de filtro para seleccionar los documentos que se van a actualizar, el parámetro `Update` para identificar los campos que se van a actualizar y un parámetro `UpdateOptions` opcional para especificar las opciones de actualización.

El siguiente ejemplo de código demuestra el uso del 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", "$$$"));
```

El siguiente ejemplo de código demuestra el método de `bulkWrite()` con la misma actualización:

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

## Eliminación de documentos de una colección de DocumentDB
<a name="deleting-documents"></a>

El controlador Java de MongoDB ofrece `deleteOne()` para eliminar un solo documento y `deleteMany()` para eliminar varios documentos que coincidan con criterios específicos. Al igual que la actualización, la operación de eliminación también se puede utilizar con el método `bulkWrite()`. Ambos `deleteOne()` y `deleteMany()` devuelven un 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 proporciona información sobre el resultado de la operación, incluido el recuento de documentos eliminados. A continuación, se muestra un ejemplo de cómo usar `deleteMany()` para eliminar varios 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());
```

## Gestión de errores con lógica de reintento
<a name="error-handling"></a>

Una estrategia sólida de gestión de errores con Amazon DocumentDB debería incluir la categorización de los errores en reintentables (como tiempos de espera de la red o problemas de conexión) y no reintentables (como errores de autenticación o consultas no válidas). En el caso de los errores de operación debidos a errores que deben reintentarse, se debe implementar un intervalo de tiempo entre cada reintento, así como un máximo de reintentos. Las operaciones CRUD deben realizarse en un bloque 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) y sus subclases. Además, debe incluir la supervisión y el registro de los errores para garantizar la visibilidad operativa. El siguiente es un ejemplo de código que muestra cómo implementar la gestión de errores de reintentos:

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

# Administración de índices en Amazon DocumentDB con Java
<a name="index-management-java"></a>

Los índices permiten una recuperación eficaz de los datos de una colección de Amazon DocumentDB. Sin índices, DocumentDB debe digitalizar todos los documentos de la colección para obtener resultados que satisfagan una consulta determinada. En este tema se proporciona información sobre cómo crear, eliminar y enumerar índices mediante los controladores Java de MongoDB. También se explica cómo determinar si se está utilizando un índice específico en la consulta y cómo hacer sugerencias a Amazon DocumentDB para que utilice un índice específico.

**Topics**
+ [Creación de índices](#creating-indexes)
+ [Eliminar índices](#dropping-indes)
+ [Determinación de la selección del índice y proporción de una sugerencia sobre el índice](#w2aac43b9b7c17c13)

Amazon DocumentDB admite muchos tipos de índices. Para obtener una descripción general integral de todos los índices compatibles, consulte esta [entrada del blog](https://aws.amazon.com/blogs/database/how-to-index-on-amazon-documentdb-with-mongodb-compatibility/). 

## Creación de índices con Java
<a name="creating-indexes"></a>

Existen dos mecanismos para crear índices en Amazon DocumentDB con controladores Java de MongoDB: mediante `runCommand()`, y mediante el método `createIndex()` para un índice único o el método `createIndexes()` para varios índices. Uno de los motivos para utilizar los métodos `createIndex()` y `createIndexes()` es que permiten gestionar mejor los errores, ya que detecta errores específicos relacionados con la creación de índices. Otra razón para usar estos métodos en lugar de `runCommand()` es que el controlador Java de MongDB proporciona un amplio conjunto de clases admitidas para la creación y manipulación de índices. Tenga en cuenta que estas clases admitidas pueden utilizarse solamente cuando use los métodos `createIndex()` o `createIndexes()`. Hay tres clases admitidas:
+ **[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 clase sirve como clase de utilidad y ofrece métodos de fábrica estáticos para crear varios tipos de índices. Simplifica el proceso de creación de definiciones de índices complejas y se suele usar junto con otras clases relacionadas con los í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)**: se trata de una clase fundamental que condensa tanto la definición de las claves de índice como sus opciones. Representa una especificación de índice completa, que combina qué indexar (las claves) con cómo indexar (las opciones). Esta clase es particularmente útil cuando se crean varios índices simultáneamente, ya que permite definir un conjunto de especificaciones de índices que se pueden pasar al 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)**: se trata de una clase de configuración completa que proporciona un amplio conjunto de métodos para personalizar el comportamiento de los índices. Incluye ajustes para índices únicos, índices dispersos, tiempo de caducidad (TTL) y expresiones de filtrado parcial. Mediante el encadenamiento de métodos, puede configurar varias opciones, como la creación de índices en segundo plano y las restricciones únicas.

**Creación de un índice único**

En este ejemplo se muestra cómo crear un índice único con el método `createIndex(`) en segundo plano. Para entender la creación de índices en segundo plano y en primer plano, consulte [Tipos de creación de índices](managing-indexes.md#index-build-types). El siguiente ejemplo de código 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 crear un índice único con el nombre «unique\$1restaurantId\$1idx» en segundo plano. A continuación, este objeto `IndexOptions` se pasa al método `createIndex()`.

```
collection.createIndex(
    Indexes.ascending("restaurantId"),
    new IndexOptions()
        .unique(true)
        .name("unique_restaurantId_idx")
        .background(true));
```

**Creación de índices múltiples**

En este ejemplo, se crean índices múltiples mediante el método `createIndexes()`. Primero crea la opción para cada índice mediante el objeto de [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) y, a continuación, pasa una lista de objetos de `IndexModel` al método `createIndexes()`. En el siguiente ejemplo de código se muestra cómo crear un índice compuesto mediante la clase de utilidad [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 clase también se usa para especificar si desea crear un índice con un orden de clasificación ascendente o descendente. Tras crear índices múltiples, llama al método `listIndexes()` para verificar la creación del índice.

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

**Creación de índices dispersos y parciales**

En este ejemplo se muestra la creación de un índice disperso y uno parcial mediante la creación de un [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))));
```

**Creación de un índice de texto**

En este ejemplo se muestra cómo crear un índice de texto. Solo se permite un índice de texto en una colección, pero ese índice de texto puede ser un índice compuesto que abarque campos múltiples. Cuando usa varios campos en el índice de texto, también puede asignar pesos a cada uno de los campos del índice. Amazon DocumentDB no admite los índices de texto en campos de matriz y, aunque puede utilizar hasta 30 campos en el índice de texto compuesto, solo se puede asignar un peso a tres campos.

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

**Creación de un índice mediante el `runCommand()`**

Amazon DocumentDB admite la creación de índices en paralelo para reducir el tiempo que se tarda en crear índices. La indexación paralela utiliza varios procesos de trabajo simultáneos. La cantidad predeterminada de procesos de trabajo que se utilizan para la creación de índices son dos. Esta [entrada del blog](https://aws.amazon.com/blogs/database/unlock-the-power-of-parallel-indexing-in-amazon-documentdb/) ofrece una discusión en profundidad sobre la indexación en paralelo. Actualmente, los controladores Java de MongDB no permiten especificar la opción de proceso de trabajo cuando se utiliza `createIndex()` o `createIndexes()` y, por lo tanto, la única forma de especificar los procesos de trabajo es mediante el `runCommand`. El siguiente ejemplo de código muestra cómo usar `runCommand` para crear un índice que aumente el número de procesos de trabajo a cuatro:

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

## Eliminar índices
<a name="dropping-indes"></a>

El controlador Java de MongoDB proporciona varios métodos para eliminar índices, ya que se adapta a diferentes situaciones y a sus preferencias. Puede eliminar los índices por nombre, por especificación de clave o eliminar todos los índices a la vez. Los métodos `dropIndex()` y `dropIndexes()` pueden invocarse en un objeto de colección para eliminar un índice. Cuando elimina un índice por nombre, debe asegurarse de que se use el nombre de índice correcto, lo que puede no ser siempre intuitivo, especialmente para los índices compuestos o generados de forma automática. Si intenta eliminar un índice inexistente, se obtendrá una [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). El índice `default _id` no se puede eliminar, ya que garantiza la exclusividad del documento dentro de la colección.

En el siguiente ejemplo de código se muestra cómo eliminar un índice con el nombre del campo donde se creó el índice o mediante la eliminación de todos los í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();
```

Cuando borra índices con claves múltiples, asegúrese de que haya un índice compuesto que contenga todas las claves especificadas y de que el orden de las claves sea correcto. El código de ejemplo de creación del índice anterior muestra una clave compuesta sobre «cocina» y características. Si intenta eliminar esa clave compuesta pero el orden no es el que se utilizó para la creación, se produce MongoCommnadException el siguiente error:

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

Se muestra el siguiente error:

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

## Determinación de la selección del índice y proporción de una sugerencia sobre el índice
<a name="w2aac43b9b7c17c13"></a>

Trabajar con la funcionalidad de explicación de Amazon DocumentDB es fundamental para comprender el rendimiento de las consultas y el uso de los índices. Cuando ejecuta una consulta, puede añadir el método `explain()` para obtener información detallada sobre el plan de consulta, incluidos los índices, si los hubiera, que se están utilizando. El resultado `explain()` proporciona información sobre las etapas de ejecución de la consulta, el número de documentos examinados y el tiempo necesario para cada etapa. Esta información es inestimable para identificar si un índice en particular se está utilizando de manera eficaz o si la consulta podría beneficiarse de una estructura de índice diferente.

El método `explain()` se puede encadenar con el método `find()`. El método `explain()` puede utilizar un enumerador opcional [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) que determine el nivel de verbosidad devuelto por `explain()`. En este momento, DocumentDB admite solamente los enumeradores `EXECUTION_STATS` y `QUERY_PLANNER`. En el siguiente ejemplo de código se muestra cómo obtener el planificador de consultas para una 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());
```

Se devuelve el siguiente documento JSON para el nivel de verbosidad del planificador 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
    }
  }
}
```

Dispone de varias opciones para incitar o forzar a Amazon DocumentDB a utilizar un índice específico. Los métodos `hint()` y `hintString()` le permiten anular el comportamiento de selección de índices predeterminado del optimizador de consultas y especificar explícitamente qué índice debe usarse para una consulta. Si bien el optimizador de consultas de DocumentDB suele ser una buena opción para la selección de índices, hay situaciones en las que forzar la aprobación de un índice específico mediante `hint()` o `hintString()` puede resultar beneficioso, como cuando se trata de datos sesgados o se comprueba el rendimiento de un índice.

El siguiente ejemplo de código fuerza el uso de un índice compuesto «cuisine\$1features\$1idx» para la misma consulta que se ejecutó en el código anterior:

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

# Programación basada en eventos con Amazon DocumentDB y Java
<a name="event-driven-programming"></a>

La programación basada en eventos en el contexto de Amazon DocumentDB representa un patrón arquitectónico potente en el que los cambios en la base de datos actúan como los principales generadores de eventos que desencadenan la lógica y los procesos empresariales posteriores. Cuando se insertan, actualizan o eliminan registros en una colección de DocumentDB, estos cambios actúan como eventos que inician automáticamente varios procesos posteriores, notificaciones o tareas de sincronización de datos. Este patrón es particularmente valioso en los sistemas distribuidos modernos, donde aplicaciones o servicios múltiples deben reaccionar a los cambios en los datos en tiempo real. El mecanismo principal de implementación de la programación basada en eventos en DocumentDB es mediante flujos de cambios.

**nota**  
En esta guía se asume que habilitó los flujos de cambios en una colección con la que está trabajando. Consulte [Uso de flujos de cambios con Amazon DocumentDB](change_streams.md) para obtener información sobre cómo habilitar los flujos de cambios en la colección. 

**Trabajo con flujos de cambios desde la aplicación Java**

El método `watch()` del controlador Java de MongoDB es el mecanismo principal para supervisar los cambios de datos en tiempo real en Amazon DocumentDB. Los 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)) y [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()) pueden llamar al método `watch()`.

El método `watch()` devuelve una instancia 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 admite varias opciones de configuración, entre las que se incluyen la búsqueda completa de actualizaciones en los documentos, el suministro de tokens de reanudación y una marca de tiempo para garantizar la fiabilidad, y las etapas de agregación de canalizaciones para filtrar los cambios. 

[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 la interfaz básica de Java `Iterable` y puede usarse con `forEach()`. Para capturar eventos mediante `forEach()`, transfiera una función de devolución de llamada a `forEach()` que procese el evento cambiado. En el siguiente fragmento de código se muestra cómo abrir un flujo de cambios en una colección para iniciar la supervisión de eventos de cambio:

```
ChangeStreamIterable < Document > iterator = collection.watch();
iterator.forEach(event - > {
    System.out.println("Received a change: " + event);
});
```

Otra forma de recorrer todos los eventos de cambio consiste en abrir un cursor que mantenga una conexión con el clúster y reciba continuamente nuevos eventos de cambio a medida que se producen. Para obtener un cursor de flujo de cambios, utilice el método `cursor()` del 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)). En el siguiente ejemplo de código se muestra cómo supervisar eventos de cambio con el cursor:

```
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) {
    System.out.println(cursor.tryNext());
}
```

Como práctica recomendada, puede crearla [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())en una try-with-resource sentencia o cerrar el cursor manualmente. Si se llama al método `cursor()` en [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)), se devuelve un `MongoChangeStreamCursor` creado sobre un objeto de [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). 

La clase [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) es un componente crucial que representa los eventos de cambio individuales en el flujo. Contiene información detallada sobre cada modificación, incluido el tipo de operación (insertar, actualizar, eliminar, reemplazar), la clave del documento, la información del espacio de nombres y el contenido completo del documento, cuando esté disponible. La clase proporciona métodos para acceder a varios aspectos del evento de cambio, como `getOperationType()` para determinar el tipo de cambio, `getFullDocument()` para acceder al estado completo del documento y `getDocumentKey()` para identificar el documento modificado.

El 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) proporciona dos datos importantes: un token de reanudación y la hora del evento de cambio.

Los tokens de reanudación y las operaciones basadas en el tiempo en los flujos de cambios de DocumentDB proporcionan mecanismos cruciales para mantener la continuidad y administrar el acceso a los datos históricos. Un token de reanudación es un identificador único que se genera para cada evento de cambio y sirve como marcador que permite que las aplicaciones reinicien el procesamiento del flujo de cambios desde un punto específico tras una desconexión o un fallo. Cuando se crea un cursor de flujo de cambios, se puede usar un token de reanudación previamente almacenado mediante la opción `resumeAfter()`, lo que permite que el flujo continúe desde donde dejó en lugar de empezar desde el principio o perder los eventos.

Las operaciones basadas en el tiempo en los flujos de cambios ofrecen diferentes enfoques para gestionar el punto de partida de la supervisión de los eventos de cambio. La opción `startAtOperationTime()` le permite empezar a observar los cambios que ocurrieron en una marca de tiempo específica o después de esta. Estas funciones basadas en el tiempo son particularmente valiosas en escenarios que requieren el procesamiento, la point-in-time recuperación o la sincronización de datos históricos entre sistemas.

El siguiente ejemplo de código recupera el evento asociado al documento de inserción, captura su token de reanudación y, a continuación, proporciona ese token para empezar a supervisar los eventos posteriores al evento de inserción. El evento se asocia al evento de actualización y, a continuación, obtiene la hora del clúster en que se produjo la actualización y utiliza esa marca de tiempo como punto de partida para el procesamiento posterior.

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

De manera predeterminada, el evento de cambio de actualización no incluye el documento completo, sino tan solo los cambios realizados. Si necesita acceder al documento completo que se actualizó, puede llamar al método `fullDocument()` en el 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)). Tenga en cuenta que, cuando solicita que se devuelva un documento completo para un evento de actualización, se devolverá el documento que existía en el momento en que se realizó la llamada al flujo de cambios.

Este método toma un enumerador [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. Actualmente, Amazon DocumentDB admite solamente valores DEFAULT y `UPDATE_LOOKUP`. El siguiente fragmento de código muestra cómo solicitar el documento completo para los eventos de actualización cuando empieza a observar los cambios:

```
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().fullDocument(FullDocument.UPDATE_LOOKUP).cursor())
```

# Cómo utilizar la validación de esquemas JSON
<a name="json-schema-validation"></a>

Con el operador de consulta de evaluación de `$jsonSchema`, puede validar los documentos que se están insertando en sus colecciones.

**Topics**
+ [Cómo crear y utilizar la validación de esquemas JSON](#get-started-with-validation)
+ [Palabras clave compatibles](#json-supported-keywords)
+ [bypassDocumentValidation](#json-schema-bypass)
+ [Limitaciones](#json-schema-limitations)

## Cómo crear y utilizar la validación de esquemas JSON
<a name="get-started-with-validation"></a>

### Cómo crear una colección con validación de esquemas
<a name="create-collection-with-validation"></a>

Puede crear una colección con reglas de operación y validación de `createCollection`. Estas reglas de validación se aplican al insertar o actualizar documentos de Amazon DocumentDB. En el siguiente ejemplo de código se muestran las reglas de validación para un conjunto de empleados:

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

### Cómo insertar un documento válido
<a name="insert-valid-document"></a>

En el siguiente ejemplo, se insertan documentos que cumplen con las reglas de validación de esquemas anteriores:

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

### Cómo insertar un documento no válido
<a name="insert-invalid-document"></a>

En el siguiente ejemplo, se insertan documentos que no cumplen con las reglas de validación de esquemas anteriores. En este ejemplo, el valor employeeId no es una cadena:

```
db.employees.insert({
    "name" : { "firstName" : "Carol" , "lastName" : "Smith"}, 
    "employeeId": 720 , 
    "salary": 1000.0 
})
```

En este ejemplo, se muestra una sintaxis incorrecta en el documento.

### Modificación de una colección
<a name="modify-collection"></a>

El comando `collMod` se utiliza para añadir o modificar las reglas de validación de la colección existente. En el siguiente ejemplo se añade un campo de salario a la lista de campos obligatorios:

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

### Cómo abordar los documentos añadidos antes de que se cambiaran las reglas de validación
<a name="pre-validation-docs"></a>

Para abordar los documentos que se añadieron a su colección antes de que se cambiaran las reglas de validación, utilice los siguientes modificadores de `validationLevel`:
+ **estricto**: aplica reglas de validación a todas las inserciones y actualizaciones.
+ **moderado**: aplica reglas de validación a los documentos válidos existentes. Durante las actualizaciones, no se comprueban los documentos no válidos existentes.

En el siguiente ejemplo, tras actualizar las reglas de validación de la colección denominada “empleados”, el campo de salario es obligatorio. No se podrá actualizar el siguiente documento:

```
db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }] 
})
```

Amazon DocumentDB devuelve el siguiente resultado:

```
{
"n" : 0,
    "nModified" : 0,
    "writeErrors" : [
        {
"index" : 0,
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

Si se actualiza el nivel de validación a `moderate`, se permitirá actualizar el documento anterior correctamente:

```
db.runCommand({
    "collMod" : "employees", 
    validationLevel : "moderate"
})

db.runCommand({ 
    update: "employees", 
    updates: [{ 
        q: { "employeeId": "c721a" }, 
        u: { age: 25 , salary : 1000}, 
        upsert: true }]
})
```

Amazon DocumentDB devuelve el siguiente resultado:

```
{
"n" : 1,
    "nModified" : 1,
    "ok" : 1,
    "operationTime" : Timestamp(1234567890, 1)
}
```

### Recuperación de documentos con el \$1jsonSchema
<a name="json-retrieve-docs"></a>

El operador de `$jsonSchema` se puede utilizar como filtro para consultar documentos que coincidan con el esquema JSON. Se trata de un operador de nivel superior que puede estar presente en los documentos de filtro como campo de nivel superior o utilizarse con operadores de consulta como `$and`, `$or` y `$nor`. En los siguientes ejemplos se muestra el uso de \$1jsonSchema como filtro individual y con otros operadores de filtro:

Documento insertado en una colección de “empleado”:

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

Colección filtrada únicamente con el operador de `$jsonSchema`:

```
db.employees.find({ 
       $jsonSchema: { required: ["age"] } })
```

Amazon DocumentDB devuelve el siguiente resultado:

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

Colección filtrada con el operador de `$jsonSchema` y otro operador:

```
db.employees.find({ 
       $or: [{ $jsonSchema: { required: ["age", "name"]}}, 
            { salary: { $lte:1000}}]});
```

Amazon DocumentDB devuelve el siguiente resultado:

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

Colección filtrada con el operador de `$jsonSchema` y con `$match` en el filtro de agregación:

```
db.employees.aggregate(
    [{ $match: { 
        $jsonSchema: { 
            required: ["name", "employeeId"],  
            properties: {"salary" :{"bsonType": "double"}}
        }
       }
    }]
)
```

Amazon DocumentDB devuelve el siguiente resultado:

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

### Cómo visualizar las reglas de validación existentes
<a name="view-validation-rules"></a>

Para ver las reglas de validación existentes en una colección, utilice:

```
db.runCommand({
    listCollections: 1, 
    filter: { name: 'employees' }
})
```

Amazon DocumentDB devuelve el siguiente resultado:

```
{
    "waitedMS" : NumberLong(0),
    "cursor" : {
        "firstBatch" : [
            {
                "name" : "employees",
                "type" : "collection",
                "options" : {
                    "autoIndexId" : true,
                    "capped" : false,
                    "validator" : {
                        "$jsonSchema" : {
                            "bsonType" : "object",
                            "title" : "employee validation",
                            "required" : [
                                "name",
                                "employeeId",
                                "salary"
                            ],
                            "properties" : {
                                "name" : {
                                    "bsonType" : "object",
                                    "properties" : {
                                        "firstName" : {
                                            "bsonType" : [
                                                "string"
                                            ]
                                        },
                                        "lastName" : {
                                            "bsonType" : [
                                                "string"
                                            ]
                                        }
                                    },
                                    "additionalProperties" : false
                                },
                                "employeeId" : {
                                    "bsonType" : "string",
                                    "description" : "Unique Identifier for employee"
                                },
                                "salary" : {
                                    "bsonType" : "double"
                                },
                                "age" : {
                                    "bsonType" : "number"
                                }
                            },
                            "additionalProperties" : true
                        }
                    },
                    "validationLevel" : "moderate",
                    "validationAction" : "error"
                },
                "info" : {
                    "readOnly" : false
                },
                "idIndex" : {
                    "v" : 2,
                    "key" : {
                        "_id" : 1
                    },
                    "name" : "_id_",
                    "ns" : "test.employees"
                }
            }
        ],
        "id" : NumberLong(0),
        "ns" : "test.$cmd.listCollections"
    },
    "ok" : 1,
    "operationTime" : Timestamp(1692788937, 1)
}
```

Amazon DocumentDB también conserva las reglas de validación en la etapa de agregación `$out`.

## Palabras clave compatibles
<a name="json-supported-keywords"></a>

Los comandos `create` y `collMod` admiten los siguientes campos:
+ **`Validator`**: admite el operador `$jsonSchem`a.
+ **`ValidationLevel`**: admite los valores `off`, `strict` y `moderate`.
+ **`ValidationAction`**: admite el valor `error`.

El operador \$1jsonSchema admite las siguientes palabras clave:
+ `additionalItems`
+ `additionalProperties`
+ `allOf`
+ `anyOf`
+ `bsonType`
+ `dependencies`
+ `description`
+ `enum`
+ `exclusiveMaximum`
+ `exclusiveMinimum`
+ `items`
+ `maximum`
+ `minimum`
+ `maxItems`
+ `minItems`
+ `maxLength`
+ `minLength`
+ `maxProperties`
+ `minProperties`
+ `multipleOf`
+ `not`
+ `oneOf`
+ `pattern`
+ `patternProperties`
+ `properties`
+ `required`
+ `title`
+ `type`
+ `uniqueItems`

## bypassDocumentValidation
<a name="json-schema-bypass"></a>

Amazon DocumentDB admite `bypassDocumentValidation` para los siguientes comandos y métodos:
+ `insert`
+ `update`
+ `findAndModify`
+ Etapa `$out` en el comando `aggregate` y en el método `db.collection.aggregate()`

Amazon DocumentDB no admite los siguientes comandos para `bypassDocumentValidation`: 
+ `$merge` en el comando `aggregate` y en el método `db.collection.aggregate()`
+ Comando `mapReduce` y método `db.collection.mapReduce()`
+ `applyOps`Comando de la 

## Limitaciones
<a name="json-schema-limitations"></a>

Las siguientes limitaciones se aplican a la validación de `$jsonSchema`:
+ Amazon DocumentDB devuelve el error “No se pudo validar el documento” cuando una operación no cumple con la regla de validación.
+ Los clústeres elásticos de Amazon DocumentDB no admiten `$jsonSchema`.