

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

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

Um índice parcial indexa documentos em uma coleção que atende a um critério de filtro especificado. O recurso parcial de índice é aceito em clusters baseados em instância do Amazon DocumentDB 5.0.

**Topics**
+ [Crie um índice parcial](#create-partial-index)
+ [Operadores compatíveis](#partial-index-operators)
+ [Consultar usando um índice parcial](#partial-index-query)
+ [Funcionalidades parciais de índice](#partial-index-functionalities)
+ [Limitações parciais do índice](#partial-index-limitations)

## Crie um índice parcial
<a name="create-partial-index"></a>

Para criar um índice parcial, use o método `createIndex()` com a opção `partialFilterExpression`. Por exemplo, a operação a seguir cria um índice composto exclusivo na coleção de pedidos que indexa documentos com um `OrderID` e com o campo `isDelivered` verdadeiro:

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

## Operadores compatíveis
<a name="partial-index-operators"></a>


+ **\$1eq**
+ **\$1exists**
+ **\$1and** (somente no nível superior)
+ **\$1gt/\$1gte/\$1lt/\$1lte** (a varredura de índice só é usada quando o filtro, predicado na consulta, corresponde exatamente à expressão do filtro parcial) (consulte Limitações)

## Consultar usando um índice parcial
<a name="partial-index-query"></a>

Os seguintes padrões de consulta são possíveis usando índices parciais:
+ O predicado da consulta corresponde exatamente à expressão do filtro de índice parcial:

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

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}},
      {"OrderAmount": {"$eq": "5"}}
    ]}).explain()
  ```
+ Um subpredicado da consulta pode ser usado em conjunto com outros índices:

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

**nota**  
Um planejador de consultas pode optar por usar uma varredura de coleção em vez de uma varredura de índice, se for eficiente fazer isso. Isso geralmente é visto em coleções ou consultas muito pequenas que retornariam uma grande parte de uma coleção.

## Funcionalidades parciais de índice
<a name="partial-index-functionalities"></a>

**Listar índices parciais**

Liste índices parciais com partialFilterExpression usando a operação `getIndex`. Por exemplo, a operação `getIndex` emitida lista índices parciais com os campos key, name e partialFilterExpressions:

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

Este exemplo retorna a saída a seguir:

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

**Expressão múltipla de filtro parcial na mesma chave:ordem**

Diferentes índices parciais podem ser criados para as mesmas combinações de campos (chave:ordem). Esses índices devem ter nomes diferentes.

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

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

Execute a operação `getIndexes` para listar todos os índices na coleção:

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

Este exemplo retorna a saída a seguir:

```
[
  {
    "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**  
Os nomes dos índices devem ser diferentes e devem ser excluídos somente pelo nome.

**Índices com propriedades parciais e TTL**

Você também pode criar índices com propriedades parciais e TTL especificando as opções `partialFilterExpression` e `expireAfterSeconds` durante a criação do índice. Isso permite que você forneça mais controle sobre quais documentos agora são removidos de uma coleção.

Por exemplo, você pode ter um índice TTL que identifica documentos a serem excluídos após um determinado período de tempo. Agora você pode fornecer condições adicionais sobre quando excluir documentos usando a opção de índice parcial:

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

Este exemplo retorna a saída a seguir:

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

Execute a operação `getIndexes` para listar os índices presentes na coleção:

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

Este exemplo retorna a saída a seguir:

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

## Limitações parciais do índice
<a name="partial-index-limitations"></a>

As seguintes limitações se aplicam ao recurso de índice parcial:
+ As consultas de desigualdade no Amazon DocumentDB só usarão um índice parcial quando o predicado do filtro de consulta corresponder exatamente a `partialFilterExpression` e for do mesmo tipo de dados.
**nota**  
Nem mesmo `$hint` pode ser usado para forçar o IXSCAN no caso acima.

  No exemplo a seguir, `partialFilterExpression` é aplicado somente a `field1`, mas não 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
  ```
+ Um `partialFilterExpression` com operadores de matriz não é compatível. A operação a seguir gerará um erro:

  ```
  db.orders.createIndex(
    {"CustomerId":1},
    {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}}
  )
  ```
+ Os operadores a seguir não são aceitos no campo partialFilterExpression:
  + `$all` (operador de matriz)
  + `$mod` (operador de matriz)
  + `$or`
  + `$xor`
  + `$not`
  + `$nor`
+ O tipo de dados da expressão do filtro e do filtro deve ser o mesmo.