Teilweiser Index - Amazon DocumentDB

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

Ein Teil indiziert Dokumente in einer Sammlung, die ein bestimmtes Filterkriterium erfüllt. Die teilweise Indexfunktion wird in Instance-basierten Clustern von Amazon DocumentDB 5.0 unterstützt.

Erstellen eines Teilindex

Um einen partiellen Index zu erstellen, verwenden Sie die -createIndex()Methode mit der -partialFilterExpressionOption. Die folgende Operation erstellt beispielsweise einen eindeutigen zusammengesetzten Index in der Auftragssammlung, der Dokumente indiziert, die einen OrderID und das isDelivered Feld als wahr haben:

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

Unterstützte Operatoren

  • $eq

  • $exists

  • $and (nur auf oberster Ebene)

  • $gt/$gte/$lt/$lte (Indexscan wird nur verwendet, wenn der in der Abfrage angegebene Filter genau mit dem teilweisen Filterausdruck übereinstimmt) (siehe Einschränkungen)

Abfragen mit einem Teilindex

Die folgenden Abfragemuster sind mit Teilindizes möglich:

  • Das Abfrageprädikat stimmt genau mit dem partiellen Indexfilterausdruck überein:

    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 Sammlungs-Scan anstelle eines Index-Scans zu verwenden, wenn dies effizient ist. Dies wird in der Regel bei sehr kleinen Sammlungen oder Abfragen beobachtet, die einen großen Teil einer Sammlung zurückgeben würden.

Funktionen für partielle Indizes

Teilindizes auflisten

Listen Sie Teilindizes mit partialFilterExpression mithilfe der -getIndexOperation auf. Die in ausgegebene getIndex Operation listet beispielsweise Teilindizes mit den Feldern key, name und partialfilterExpressions auf:

db.orders.getIndexes()

In diesem Beispiel wird die folgende Ausgabe zurückgegeben:

[ { "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 (key:order) 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 den getIndexes 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 Teil- und TTL-Eigenschaften

Sie können auch Indizes mit Teil- und TTL-Eigenschaften erstellen, indem Sie während der Indexerstellung die expireAfterSeconds Optionen partialFilterExpression und angeben. Auf diese Weise können Sie besser steuern, welche Dokumente jetzt aus einer Sammlung entfernt werden.

Sie können beispielsweise einen TTL-Index haben, der Dokumente identifiziert, die nach einem bestimmten Zeitraum gelöscht werden sollen. Sie können jetzt zusätzliche Bedingungen dafür angeben, wann Dokumente mit der Option Teilindex gelöscht werden sollen:

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

In diesem Beispiel wird die folgende Ausgabe zurückgegeben:

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

Führen Sie die -getIndexesOperation aus, um Indizes aufzulisten, die in der Sammlung vorhanden sind:

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

In diesem Beispiel wird die folgende Ausgabe zurückgegeben:

[ { "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 Teilindex

Die folgenden Einschränkungen gelten für die Teilindexfunktion:

  • Ungleichheitsabfragen in Amazon DocumentDB verwenden nur dann einen partiellen Index, wenn das Abfragefilterprädikat genau mit dem übereinstimmt partialFilterExpression und vom gleichen Datentyp ist.

    Anmerkung

    Auch kann für den obigen Fall $hint nicht verwendet werden, um IXSCAN zu erzwingen.

    Im folgenden Beispiel partialFilterExpression wird die nur auf angewendet, field1 aber nicht auf 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
  • Ein partialFilterExpression mit Array-Operatoren wird 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 der Filter sollten identisch sein.