

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Teilweiser Index
<a name="partial-index"></a>

Ein partieller Index indiziert Dokumente in einer Sammlung, die ein bestimmtes Filterkriterium erfüllen. Die Funktion für den teilweisen Index wird in instanzbasierten Amazon DocumentDB 5.0-Clustern unterstützt.

**Topics**
+ [Erstellen Sie einen Teilindex](#create-partial-index)
+ [Unterstützte Operatoren](#partial-index-operators)
+ [Abfrage mit einem Teilindex](#partial-index-query)
+ [Funktionen des partiellen Indexes](#partial-index-functionalities)
+ [Einschränkungen des partiellen Indexes](#partial-index-limitations)

## Erstellen Sie einen Teilindex
<a name="create-partial-index"></a>

Um einen Teilindex zu erstellen, verwenden Sie die `createIndex()` Methode mit der `partialFilterExpression` Option. Mit der folgenden Operation wird beispielsweise ein eindeutiger zusammengesetzter Index in der Orders-Auflistung erstellt, der Dokumente indexiert, die ein `OrderID` und das `isDelivered` Feld den Wert true haben:

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

## Unterstützte Operatoren
<a name="partial-index-operators"></a>


+ **\$1eq**
+ **\$1exists**
+ **\$1and** (nur auf oberster Ebene)
+ **\$1gt/\$1gte/\$1lt/\$1lte** (Indexscan wird nur verwendet, wenn der in der Abfrage angegebene Filter exakt mit dem partiellen Filterausdruck übereinstimmt) (siehe Einschränkungen)

## Abfrage mit einem Teilindex
<a name="partial-index-query"></a>

Die folgenden Abfragemuster sind mit partiellen Indizes möglich:
+ Das Abfrageprädikat entspricht exakt dem Filterausdruck für den partiellen Index:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}}
    ]}).explain()
  ```
+ Das erwartete Ergebnis des Abfragefilters ist eine logische Teilmenge des Teilfilters:

  ```
  db.orders.find({"$and": [
      {"OrderId": {"$exists": true}}, 
      {"isDelivered": {"$eq": false}},
      {"OrderAmount": {"$eq": "5"}}
    ]}).explain()
  ```
+ Ein Unterprädikat der Abfrage kann in Verbindung mit anderen Indizes verwendet werden:

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

**Anmerkung**  
Ein Abfrageplaner kann sich dafür entscheiden, einen Sammlungsscan anstelle eines Indexscans zu verwenden, wenn dies effizient ist. Dies ist in der Regel bei sehr kleinen Sammlungen oder Abfragen der Fall, bei denen ein großer Teil einer Sammlung zurückgegeben würde.

## Funktionen des partiellen Indexes
<a name="partial-index-functionalities"></a>

**Listet Teilindizes auf**

Listet Teilindizes auf, die die partialFilterExpression `getIndex` Operation verwenden. Beispielsweise listet die in ausgegebene `getIndex` Operation Teilindizes mit den Feldern key, name und partialFilterExpressions auf:

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

Dieses Beispiel gibt die folgende Ausgabe zurück:

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

**Mehrere partielle Filterausdrücke für denselben Schlüssel:Reihenfolge**

Für dieselben Feldkombinationen (Schlüssel:Reihenfolge) können unterschiedliche Teilindizes erstellt werden. Diese Indizes müssen einen anderen Namen haben.

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

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

Führen Sie `getIndexes` den Vorgang aus, um alle Indizes in der Sammlung aufzulisten:

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

Diese Beispiele geben die folgende Ausgabe zurück:

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

**Wichtig**  
Indexnamen müssen unterschiedlich sein und dürfen nur nach Namen gelöscht werden.

**Indizes mit partiellen Eigenschaften und TTL-Eigenschaften**

Sie können auch Indizes mit partiellen Eigenschaften und TTL-Eigenschaften erstellen, indem Sie bei der Indexerstellung beide `partialFilterExpression` `expireAfterSeconds` Optionen angeben. Auf diese Weise können Sie besser kontrollieren, welche Dokumente jetzt aus einer Sammlung entfernt werden.

Beispielsweise verfügen Sie möglicherweise über einen TTL-Index, der Dokumente identifiziert, die nach einem bestimmten Zeitraum gelöscht werden sollen. Mit der Option „Teilindex“ können Sie jetzt zusätzliche Bedingungen dafür festlegen, wann Dokumente gelöscht werden sollen:

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

Dieses Beispiel gibt die folgende Ausgabe zurück:

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

Führen Sie den `getIndexes` Vorgang aus, um die in der Sammlung vorhandenen Indizes aufzulisten:

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

Dieses Beispiel gibt die folgende Ausgabe zurück:

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

## Einschränkungen des partiellen Indexes
<a name="partial-index-limitations"></a>

Für die Funktion „Teilindex“ gelten die folgenden Einschränkungen:
+ Ungleichheitsabfragen in Amazon DocumentDB verwenden nur dann einen Teilindex, wenn das Abfragefilterprädikat genau dem entspricht `partialFilterExpression` und denselben Datentyp hat.
**Anmerkung**  
`$hint`Kann im obigen Fall sogar nicht verwendet werden, um IXSCAN zu erzwingen.

  Im folgenden Beispiel `partialFilterExpression` wird das nur angewendet, `field1` aber nicht`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
  ```
+ A `partialFilterExpression` mit Array-Operatoren werden nicht unterstützt. Der folgende Vorgang generiert einen Fehler:

  ```
  db.orders.createIndex(
    {"CustomerId":1},
    {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}}
  )
  ```
+ Die folgenden Operatoren werden im partialFilterExpression Feld nicht unterstützt:
  + `$all`(Array-Operator)
  + `$mod`(Array-Operator)
  + `$or`
  + `$xor`
  + `$not`
  + `$nor`
+ Der Datentyp des Filterausdrucks und des Filters sollten identisch sein.