

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Indice parziale
<a name="partial-index"></a>

Un indice parziale indicizza i documenti di una raccolta che soddisfa un criterio di filtro specificato. La funzionalità di indice parziale è supportata nei cluster basati su istanze di Amazon DocumentDB 5.0.

**Topics**
+ [Crea un indice parziale](#create-partial-index)
+ [Operatori supportati](#partial-index-operators)
+ [Interrogazione utilizzando un indice parziale](#partial-index-query)
+ [Funzionalità di indicizzazione parziale](#partial-index-functionalities)
+ [Limitazioni parziali dell'indice](#partial-index-limitations)

## Crea un indice parziale
<a name="create-partial-index"></a>

Per creare un indice parziale, utilizzate il `createIndex()` metodo con l'`partialFilterExpression`opzione. Ad esempio, l'operazione seguente crea un indice composto univoco nella raccolta orders che indicizza i documenti il cui `isDelivered` campo è impostato su true: `OrderID`

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

## Operatori supportati
<a name="partial-index-operators"></a>


+ **\$1eq**
+ **\$1exists**
+ **\$1and** (solo al livello superiore)
+ **\$1gt/\$1gte/\$1lt/\$1lte** (la scansione dell'indice viene utilizzata solo quando il filtro, previsto nella query, corrisponde esattamente all'espressione parziale del filtro) (vedi Limitazioni)

## Interrogazione utilizzando un indice parziale
<a name="partial-index-query"></a>

I seguenti modelli di interrogazione sono possibili utilizzando indici parziali:
+ Il predicato della query corrisponde esattamente all'espressione del filtro dell'indice parziale:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}).explain()
  ```
+ Il risultato previsto dal filtro di interrogazione è un sottoinsieme logico del filtro parziale:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}},
      {"OrderAmount": {"$eq": "5"}}
    ]}).explain()
  ```
+ Un sottopredicato della query può essere utilizzato insieme ad altri indici:

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

**Nota**  
Un pianificatore di query può scegliere di utilizzare una scansione della raccolta anziché una scansione dell'indice se è efficiente farlo. Questo si verifica in genere per raccolte molto piccole o per query che restituirebbero una grande parte di una raccolta.

## Funzionalità di indicizzazione parziale
<a name="partial-index-functionalities"></a>

**Elenca gli indici parziali**

Elenca gli indici parziali utilizzando l'operazione. partialFilterExpression `getIndex` Ad esempio, l'`getIndex`operazione emessa in elenca gli indici parziali con i campi key, name e partialFilterExpressions:

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

Questo esempio restituisce il seguente risultato:

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

**Espressione di filtro parziale multipla sulla stessa chiave:order**

È possibile creare diversi indici parziali per le stesse combinazioni di campi (key:order). Questi indici devono avere un nome diverso.

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

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

Esegui `getIndexes` l'operazione per elencare tutti gli indici della raccolta:

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

Questi esempi restituiscono il seguente risultato:

```
[
  {
    "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**  
I nomi degli indici devono essere diversi e devono essere eliminati solo per nome.

**Indici con proprietà parziali e TTL**

È inoltre possibile creare indici con proprietà parziali e TTL specificando entrambe le opzioni durante la creazione dell'indice. `partialFilterExpression` `expireAfterSeconds` Ciò consente di fornire un maggiore controllo su quali documenti vengono ora rimossi da una raccolta.

Ad esempio, potresti avere un indice TTL che identifica i documenti da eliminare dopo un certo periodo di tempo. Ora puoi fornire condizioni aggiuntive su quando eliminare i documenti utilizzando l'opzione di indice parziale:

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

Questo esempio restituisce il seguente risultato:

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

Eseguite l'`getIndexes`operazione per elencare gli indici presenti nella raccolta:

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

Questo esempio restituisce il seguente risultato:

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

## Limitazioni parziali dell'indice
<a name="partial-index-limitations"></a>

Le seguenti limitazioni si applicano alla funzionalità di indice parziale:
+ Le query di disuguaglianza in Amazon DocumentDB utilizzeranno un indice parziale solo quando il predicato del filtro di query corrisponde esattamente a ed è `partialFilterExpression` dello stesso tipo di dati.
**Nota**  
`$hint`Non può essere utilizzato nemmeno per forzare IXSCAN nel caso precedente.

  Nell'esempio seguente, `partialFilterExpression` viene applicato solo `field1` ma non `field2` a:

  ```
  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
  ```
+ Gli operatori A `partialFilterExpression` con array non sono supportati. La seguente operazione genererà un errore:

  ```
  db.orders.createIndex(
    {"CustomerId":1},
    {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}}
  )
  ```
+ I seguenti operatori non sono supportati nel partialFilterExpression campo:
  + `$all`(operatore di matrice)
  + `$mod`(operatore di matrice)
  + `$or`
  + `$xor`
  + `$not`
  + `$nor`
+ Il tipo di dati dell'espressione del filtro e del filtro devono essere gli stessi.