

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.

# Índice parcial
<a name="partial-index"></a>

Un índice parcial indexa los documentos de una colección que cumplen un criterio de filtro especificado. La característica de índice parcial se admite en los clústeres basados en instancias de Amazon DocumentDB 5.0.

**Topics**
+ [Creación de un índice parcial](#create-partial-index)
+ [Operadores admitidos](#partial-index-operators)
+ [Consulta mediante un índice parcial](#partial-index-query)
+ [Funcionalidades de indexación parcial](#partial-index-functionalities)
+ [Limitaciones del índice parcial](#partial-index-limitations)

## Creación de un índice parcial
<a name="create-partial-index"></a>

Para crear un índice parcial, utilice el método `createIndex()` con la opción `partialFilterExpression`. Por ejemplo, la siguiente operación crea un índice compuesto único en la colección de pedidos que indexa los documentos que tienen un `OrderID` y cuyo campo `isDelivered` es true:

```
db.orders.createIndex(
  {"category": 1, "CustomerId": 1, "OrderId": 1}, 
  {"unique": true, "partialFilterExpression": 
    {"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}
  }
)
```

## Operadores admitidos
<a name="partial-index-operators"></a>


+ **\$1eq**
+ **\$1exists**
+ **\$1and** (solo en el nivel superior)
+ **\$1gt/\$1gte/\$1lt/\$1lte** (el escaneo de índices solo se usa cuando el filtro, basado en la consulta, coincide exactamente con la expresión del filtro parcial) (consulte las limitaciones)

## Consulta mediante un índice parcial
<a name="partial-index-query"></a>

Los siguientes patrones de consulta son posibles con índices parciales:
+ El predicado de la consulta coincide exactamente con la expresión del filtro de índice parcial:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}).explain()
  ```
+ El resultado esperado del filtro de consulta es un subconjunto lógico del filtro parcial:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}},
      {"OrderAmount": {"$eq": "5"}}
    ]}).explain()
  ```
+ Se puede utilizar un subpredicado de la consulta junto con otros índices:

  ```
  db.orders.createIndex({"anotherIndex":1})
  db.orders.find({ "$or": [
        {"$and": [
          {"OrderId": {"$exists": true}}, 
          {"isDelivered": {"$eq": false}}
        ]},
        {"anotherIndex": {"$eq": 5}}
      ]
    }).explain()
  ```

**nota**  
Un planificador de consultas puede optar por utilizar un escaneo de colecciones en lugar de un escaneo de índices si es eficiente hacerlo. Esto suele ocurrir en el caso de colecciones o consultas muy pequeñas que devuelven una gran parte de una colección.

## Funcionalidades de indexación parcial
<a name="partial-index-functionalities"></a>

**Lista de índices parciales**

Enumere los índices parciales con partialFilterExpression mediante la operación `getIndex`. Por ejemplo, la operación `getIndex` emitida en las listas de índices parciales con los campos clave, nombre y partialfilterExpressions:

```
db.orders.getIndexes()
```

En este ejemplo, se devuelve la siguiente salida:

```
[
  {
    "v" : 4,
    "key" : {
      "_id" : 1
    },
    "name" : "_id_",
    "ns" : "ecommerceApp.orders"
  },
  {
    "v" : 4,
    "unique" : true,
    "key" : {
      "category" : 1,
      "" : 1,
      "CustomerId" : 1,
      "OrderId" : 1
    },
    "name" : "category_1_CustID_1_OrderId_1",
    "ns" : "ecommerceApp.orders",
    "partialFilterExpression" : {
      "$and" : [
        {"OrderId": {"$exists": true}}, 
        {"isDelivered": {"$eq": false}}
      ]
    }
  }
]
```

**Expresión de filtro parcial múltiple en la misma clave:orden**

Se pueden crear diferentes índices parciales para las mismas combinaciones de campos (clave:orden). Estos índices deben tener un nombre distinto.

```
db.orders.createIndex(
  {"OrderId":1},
  {
    name:"firstPartialIndex",
    partialFilterExpression:{"OrderId":{"$exists": true}}
  }
)
```

```
db.orders.createIndex(
  {"OrderId":1},
  {
    name:"secondPartialIndex",
    partialFilterExpression:{"OrderId":{"$gt": 1000}}
  }
)
```

Ejecute la operación `getIndexes` para enumerar todos los índices de la colección:

```
db.orders.getIndexes()
```

En estos ejemplos, se devuelve la siguiente salida:

```
[
  {
    "v" : 4,
    "key" : {
      "_id" : 1
    },
    "name" : "_id_",
    "ns" : "ecommerceApp.orders"
  },
  {
    "v" : 4,
    "key" : {
      "OrderId" : 1
    },
    "name" : "firstPartialIndex",
    "ns" : "ecommerceApp.orders",
    "partialFilterExpression" : {"OrderId":{"$exists": true}}
  },
  {
    "v" : 4,
    "key" : {
      "OrderId" : 1
    },
    "name" : "secondPartialIndex",
    "ns" : "ecommerceApp.orders",
    "partialFilterExpression" : {"OrderId":{"$gt": 1000}}
  }
]
```

**importante**  
Los nombres de los índices deben ser diferentes y se deben eliminar solo por su nombre.

**Índices con propiedades parciales y TTL**

También puede crear índices con propiedades parciales y TTL mediante la especificación de las opciones `partialFilterExpression` y `expireAfterSeconds` durante la creación del índice. Esto le permite tener más control sobre qué documentos se eliminan ahora de una colección.

Por ejemplo, puede tener un índice TTL que identifique los documentos que se van a eliminar después de un periodo de tiempo determinado. Ahora puede establecer condiciones adicionales sobre cuándo eliminar documentos mediante la opción de índice parcial:

```
db.orders.createIndex(
    { "OrderTimestamp": 1 },
    {
        expireAfterSeconds: 3600 , 
        partialFilterExpression: { "isDelivered": { $eq: true } } 
    }
)
```

En este ejemplo, se devuelve la siguiente salida:

```
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1234567890, 1)
}
```

Ejecute la operación `getIndexes` para enumerar los índices de la colección:

```
db.orders.getIndexes()
[
    {
        "v" : 4,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.orders"
    }
```

En este ejemplo, se devuelve la siguiente salida:

```
[
    {
        "v": 4,
        "key": {
            "_id": 1
        },
        "name": "_id_",
        "ns": "ecommerceApp.orders"
    },
    {
        "v": 4,
        "key": {
            "OrderTimestamp": 1
        },
        "name": "OrderTimestamp_1",
        "ns": "ecommerceApp.orders",
        "partialFilterExpression": {
            "isDelivered": {
                "$eq": true
            }
        },
        "expireAfterSeconds": 3600
    }
]
```

## Limitaciones del índice parcial
<a name="partial-index-limitations"></a>

La característica de índice parcial tiene las siguientes limitaciones:
+ Las consultas de desigualdad en Amazon DocumentDB solo utilizarán un índice parcial cuando el predicado del filtro de consultas coincida exactamente con el `partialFilterExpression` y sea del mismo tipo de datos.
**nota**  
Ni siquiera `$hint` se puede usar para forzar el IXSCAN en el caso anterior.

  En el siguiente ejemplo, `partialFilterExpression` solo se aplica a `field1`, pero no a `field2`:

  ```
  db.orders.createIndex(
    {"OrderAmount": 1}, 
    {"partialFilterExpression": { OrderAmount : {"$gt" : 5}}}
  )
  
  db.orders.find({OrderAmount : {"$gt" : 5}}) // Will use partial index
  db.orders.find({OrderAmount : {"$gt" : 6}}) // Will not use partial index
  db.orders.find({OrderAmount : {"$gt" : Decimal128(5.00)}}) // Will not use partial index
  ```
+ No se admite `partialFilterExpression` con los operadores de matriz. La siguiente operación generará un error:

  ```
  db.orders.createIndex(
    {"CustomerId":1},
    {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}}
  )
  ```
+ Los siguientes operadores no se admiten en el campo partialFilterExpression:
  + `$all` (operador de matrices)
  + `$mod` (operador de matrices)
  + `$or`
  + `$xor`
  + `$not`
  + `$nor`
+ El tipo de datos de la expresión de filtro y el filtro deben ser iguales.