Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit Azure Cosmos DB for MongoDB können Sie die Indizierung verwenden, um die Abfrageleistung zu beschleunigen. In diesem Artikel erfahren Sie, wie Sie Indizes für einen schnelleren Datenabruf und eine bessere Effizienz verwalten und optimieren.
Indizierung für MongoDB-Serverversion 3.6 und höher
Azure Cosmos DB for MongoDB, Serverversion 3.6 und höher, indiziert automatisch das Feld _id und den Shard-Schlüssel (nur in Shardsammlungen). Die API erzwingt die Eindeutigkeit des Felds _id pro gemeinsam verwendetem Schlüssel.
Die API für MongoDB funktioniert anders als Azure Cosmos DB for NoSQL, die standardmäßig alle Felder indiziert.
Bearbeiten der Indizierungsrichtlinie
Bearbeiten Sie Ihre Indizierungsrichtlinie im Daten-Explorer im Azure-Portal. Fügen Sie einzelne Felder und Platzhalterindizes aus dem Editor für Indizierungsrichtlinien im Daten-Explorer hinzu:
Hinweis
Mit dem Editor für Indizierungsrichtlinien im Daten-Explorer können Sie keine zusammengesetzten Indizes erstellen.
Indextypen
Einzelfeld
Erstellen Sie einen Index für ein beliebiges einzelnes Feld. Die Sortierreihenfolge des Einzelfeldindexes ist unerheblich. Verwenden Sie den folgenden Befehl, um einen Index für das Feld name zu erstellen:
db.coll.createIndex({name:1})
Erstellen Sie denselben Index für ein einzelnes Feld für name im Azure-Portal:
Eine Abfrage verwendet mehrere einzelne Feldindizes, sofern verfügbar. Erstellen Sie bis zu 500 einzelne Feldindizes pro Sammlung.
Zusammengesetzte Indizes (MongoDB-Serverversion 3.6 und höher)
Verwenden Sie in der API für MongoDB zusammengesetzte Indizes mit Abfragen, die mehrere Felder gleichzeitig sortieren. Für Abfragen mit mehreren Filtern, die nicht sortiert werden müssen, sollten Sie anstelle eines einzelnen zusammengesetzten Indexes mehrere Einzelfeldindizes erstellen.
Ein zusammengesetzter Index oder einzelne Feldindizes für jedes Feld im zusammengesetzten Index ermöglichen dieselbe Leistung beim Filtern von Abfragen.
Zusammengesetzte Indizes für geschachtelte Felder werden aufgrund von Einschränkungen bei Arrays standardmäßig nicht unterstützt. Wenn ein geschachteltes Feld nicht über ein Array verfügt, funktioniert der Index wie vorgesehen. Wenn ein geschachteltes Feld an einer beliebigen Stelle im Pfad ein Array aufweist, wird dieser Wert im Index ignoriert.
Beispielsweise funktioniert in diesem Fall ein zusammengesetzter Index mit people.dylan.age, da sich kein Array im Pfad befindet:
{
"people": {
"dylan": {
"name": "Dylan",
"age": "25"
},
"reed": {
"name": "Reed",
"age": "30"
}
}
}
Derselbe zusammengesetzte Index funktioniert in diesem Fall nicht, da ein Array im Pfad vorhanden ist:
{
"people": [
{
"name": "Dylan",
"age": "25"
},
{
"name": "Reed",
"age": "30"
}
]
}
Aktivieren Sie dieses Feature für Ihr Datenbankkonto, indem Sie die Funktion „EnableUniqueCompoundNestedDocs“ aktivieren.
Hinweis
Für Arrays können keine Verbundindizes erstellt werden.
Der folgende Befehl erstellt einen zusammengesetzten Index für die Felder name und age:
db.coll.createIndex({name:1,age:1})
Sie können zusammengesetzte Indizes zum gleichzeitigen Sortieren anhand mehrerer Felder verwenden, wie im folgenden Beispiel gezeigt:
db.coll.find().sort({name:1,age:1})
Sie können obigen zusammengesetzten Index auch für die effiziente Sortierung einer Abfrage mit der umgekehrten Sortierreihenfolge anhand aller Felder verwenden. Hier sehen Sie ein Beispiel:
db.coll.find().sort({name:-1,age:-1})
Allerdings muss die Reihenfolge der Pfade im zusammengesetzten Index exakt mit der Abfrage übereinstimmen. Hier finden Sie ein Beispiel für eine Abfrage, bei der ein zusätzlicher zusammengesetzter Index erforderlich wäre:
db.coll.find().sort({age:1,name:1})
Indizes mit mehreren Schlüsseln
Azure Cosmos DB erstellt Indizes mit mehreren Schlüsseln zum Indizieren von Inhalten in Arrays. Wenn Sie ein Feld mit einem Arraywert indizieren, indiziert Azure Cosmos DB automatisch jedes Element im Array.
Räumliche Indizes
Viele räumliche Operatoren profitieren von räumlichen Indizes. Azure Cosmos DB for MongoDB unterstützt 2dsphere-Indizes. Die API unterstützt 2d-Indizes noch nicht.
Hier sehen Sie ein Beispiel für das Erstellen eines räumlichen Indexes für das Feld location:
db.coll.createIndex({ location : "2dsphere" })
Textindizes
Azure Cosmos DB for MongoDB unterstützt keine Textindizes. Verwenden Sie für Textsuchabfragen in Zeichenfolgen die Integration für Azure KI-Suche in Azure Cosmos DB.
Platzhalterindizes
Verwenden Sie Platzhalterindizes, um Abfragen für unbekannte Felder zu unterstützen. Stellen Sie sich eine Sammlung vor, die Daten zu Familien enthält.
Dies ist Teil eines Beispieldokuments in dieser Sammlung:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Hier ist ein weiteres Beispiel mit einem anderen Satz von Eigenschaften in children:
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
Dokumente in dieser Sammlung können viele verschiedene Eigenschaften aufweisen. Um alle Daten im Array children indizieren zu können, erstellen Sie separate Indizes für jede Eigenschaft, oder erstellen Sie einen Platzhalterindex für das gesamte Array children.
Erstellen eines Platzhalterindex
Verwenden Sie den folgenden Befehl, um einen Platzhalterindex für alle Eigenschaften innerhalb von children zu erstellen:
db.coll.createIndex({"children.$**" : 1})
- Anders als in MongoDB können von Platzhalterindizes mehrere Felder in Abfrageprädikaten unterstützt werden. Für die Abfrageleistung ist es unerheblich, ob Sie einen einzelnen Platzhalterindex verwenden oder einen separaten Index für jede Eigenschaft erstellen.
Erstellen Sie folgende Indextypen mit Platzhaltersyntax:
- Einzelfeld
- Geodaten
Indexierung aller Eigenschaften
Erstellen Sie einen Platzhalterindex für alle Felder mit dem folgenden Befehl:
db.coll.createIndex( { "$**" : 1 } )
Erstellen Sie Platzhalterindizes mit dem Daten-Explorer im Azure-Portal:
Hinweis
Wenn Sie gerade mit der Entwicklung beginnen, beginnen Sie mit einem Platzhalterindex für alle Felder. Dieser Ansatz vereinfacht die Entwicklung und erleichtert die Optimierung von Abfragen.
Dokumente mit vielen Feldern können eine hohe Gebühr für Anforderungseinheiten (Request Unit, RU) für Schreibvorgänge und Updates aufweisen. Wenn Sie über einen schreibintensiven Workload verfügen, verwenden Sie einzeln indizierte Pfade anstelle von Platzhaltern.
Einschränkungen
Folgende Indextypen oder Eigenschaften werden von Platzhalterindizes nicht unterstützt:
Verbund
TTL
Einzigartig
Im Gegensatz zu MongoDB können Sie in Azure Cosmos DB for MongoDB keine Platzhalterindizes verwenden für:
Erstellen eines Wildcard-Index, der mehrere spezifische Felder beinhaltet
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection " : { "children.givenName" : 1, "children.grade" : 1 } } )Erstellen eines Platzhalterindex, der mehrere spezifische Felder ausschließt
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "children.givenName" : 0, "children.grade" : 0 } } )
Erstellen Sie alternativ mehrere Platzhalterindizes.
Indexeigenschaften
Die folgenden Vorgänge können für Konten mit der Wire-Protokollversion 4.0 und frühere Versionen verwendet werden. Erfahren Sie mehr über unterstützte Indizes und indizierte Eigenschaften.
Eindeutige Indizes
Eindeutige Indizes stellen sicher, dass zwei oder mehr Dokumente nicht den gleichen Wert für indizierte Felder aufweisen.
Führen Sie den folgenden Befehl aus, um einen eindeutigen Index für das Feld student_id zu erstellen:
db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Bei partitionierten Sammlungen muss für die Erstellung eines eindeutigen Indexes der gemeinsam verwendete Schlüssel (Partitionsschlüssel) angegeben werden. Alle eindeutigen Indizes einer geteilten Sammlung sind zusammengesetzte Indizes, bei denen eines der Felder der gemeinsam verwendete Schlüssel ist. Der gemeinsam verwendete Schlüssel sollte das erste Feld in der Indexdefinition sein.
Führen Sie die folgenden Befehle aus, um eine geteilte Sammlung namens coll (mit university als gemeinsam verwendeter Schlüssel) und einen eindeutigen Index für die Felder student_id und university zu erstellen:
db.runCommand({shardCollection: db.coll._fullName, key: { university: "hashed"}});
{
"_t" : "ShardCollectionResponse",
"ok" : 1,
"collectionsharded" : "test.coll"
}
db.coll.createIndex( { "university" : 1, "student_id" : 1 }, {unique:true});
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4
}
Wenn Sie die "university":1-Klausel im vorherigen Beispiel weglassen, wird die folgende Fehlermeldung angezeigt:
cannot create unique index over {student_id : 1.0} with shard key pattern { university : 1.0 }
Einschränkungen
Erstellen Sie eindeutige Indizes, während die Sammlung leer ist.
Azure Cosmos DB für MongoDB-Konten mit fortlaufender Sicherung unterstützen das Erstellen eines eindeutigen Indexes für eine vorhandene Sammlung nicht. Für ein solches Konto müssen eindeutige Indizes zusammen mit ihrer Sammlungserstellung erstellt werden. Dies muss und kann nur mithilfe der Erweiterungsbefehle zum Erstellen von Sammlungen erfolgen.
db.runCommand({customAction:"CreateCollection", collection:"coll", shardKey:"student_id", indexes:[
{key: { "student_id" : 1}, name:"student_id_1", unique: true}
]});
Eindeutige Indizes für geschachtelte Felder werden aufgrund von Einschränkungen bei Arrays standardmäßig nicht unterstützt. Wenn Ihr geschachteltes Feld nicht über ein Array verfügt, funktioniert der Index wie vorgesehen. Wenn Ihr geschachteltes Feld an beliebiger Stelle im Pfad ein Array enthält, wird dieser Wert im eindeutigen Index ignoriert, und die Eindeutigkeit bleibt für diesen Wert nicht erhalten.
In diesem Fall funktioniert beispielsweise ein eindeutiger Index für people.tom.age, da kein Array im Pfad vorhanden ist:
{
"people": {
"tom": {
"age": "25"
},
"mark": {
"age": "30"
}
}
}
Derselbe zusammengesetzte Index funktioniert in diesem Fall nicht, da ein Array im Pfad vorhanden ist:
{
"people": {
"tom": [
{
"age": "25"
}
],
"mark": [
{
"age": "30"
}
]
}
}
Dieses Feature kann für Ihr Datenbankkonto durch Aktivieren der Funktion „EnableUniqueCompoundNestedDocs“ aktiviert werden.
TTL-Indizes
Wenn Sie Dokumente in einer Sammlung ablaufen lassen möchten, erstellen Sie einen TTL-Index (Time-to-Live). Ein TTL-Index ist ein Index für das Feld _ts mit einem Wert für expireAfterSeconds.
Beispiel:
db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Mit dem vorherigen Befehl werden alle Dokumente in der Sammlung db.coll gelöscht, die vor mehr als 10 Sekunden geändert wurden.
Hinweis
Das Feld _ts ist spezifisch für Azure Cosmos DB und kann nicht von MongoDB-Clients aus zugänglich sein. Dies ist eine reservierte Eigenschaft (Systemeigenschaft), die den Zeitstempel der letzten Änderung eines Dokuments enthält.
Fortschritt der Indexierung nachverfolgen
Version 3.6 und höher von Azure Cosmos DB for MongoDB unterstützt den Befehl currentOp() zum Nachverfolgen des Indizierungsfortschritts in einer Datenbankinstanz. Dieser Befehl gibt ein Dokument zurück, das Informationen zu den aktuell in Bearbeitung befindlichen Vorgängen in einer Datenbankinstanz enthält. Verwenden Sie den Befehl currentOp, um alle laufenden Vorgänge in der nativen MongoDB-Datenbank zu verfolgen. In Azure Cosmos DB for MongoDB unterstützt dieser Befehl nur die Nachverfolgung des Indizierungsvorgangs.
Im Folgenden werden einige Beispiele zur Verwendung des Befehls currentOp zur Nachverfolgung des Indizierungsfortschritts gezeigt:
Abrufen des Indexfortschritts für eine Sammlung:
db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})Abrufen des Indizierungsfortschritts für alle Sammlungen in einer Datenbank:
db.currentOp({"command.$db": <databaseName>})Abrufen des Indizierungsfortschritts für alle Datenbanken und Sammlungen in einem Azure Cosmos DB-Konto:
db.currentOp({"command.createIndexes": { $exists : true } })
Beispiele für die Ausgabe des Indizierungsfortschritts
Die Details zum Indizierungsfortschritt zeigen den Fortschritt des aktuellen Indizierungsvorgangs in Prozent an. In den folgenden Beispielen wird das Format des ausgegebenen Dokuments für verschiedene Phasen des Indexfortschritts veranschaulicht:
Wenn ein Indizierungsvorgang für die Sammlung „foo“ und die Datenbank „bar“ einen Fortschritt von 60 % aufweist, wird das folgende Dokument ausgegeben. Im Feld
Inprog[0].progress.totalwird 100 als Zielprozentsatz für den Abschluss angezeigt.{ "inprog": [ { ... "command": { "createIndexes": foo "indexes": [], "$db": bar }, "msg": "Index Build (background) Index Build (background): 60 %", "progress": { "done": 60, "total": 100 }, ... } ], "ok": 1 }Bei einem Indizierungsvorgang, der erst für die Sammlung „foo“ und die Datenbank „bar“ gestartet wurde, zeigt das Ausgabedokument einen Fortschritt von 0 % an, bis ein messbarer Wert erreicht wurde.
{ "inprog": [ { ... "command": { "createIndexes": foo "indexes": [], "$db": bar }, "msg": "Index Build (background) Index Build (background): 0 %", "progress": { "done": 0, "total": 100 }, ... } ], "ok": 1 }Wenn der Indizierungsvorgang abgeschlossen wird, zeigt das Ausgabedokument leere
inprog-Vorgänge an.{ "inprog" : [], "ok" : 1 }
Indexaktualisierungen im Hintergrund
Indexaktualisierungen werden immer im Hintergrund ausgeführt, unabhängig davon, welchen Wert Sie für die Background-Indexeigenschaft festgelegt haben. Da Indexaktualisierungen Anforderungseinheiten (Request Units, RUs) mit einer niedrigeren Priorität als andere Datenbankvorgänge nutzen, führen Indexänderungen nicht zu Ausfallzeiten bei Schreib-, Update- oder Löschvorgängen.
Das Hinzufügen eines neuen Indexes wirkt sich nicht auf die Leseverfügbarkeit aus. Abfragen verwenden neue Indizes erst nach Abschluss der Indextransformation. Während der Transformation verwendet das Abfragemodul weiterhin vorhandene Indizes, sodass Sie eine ähnliche Leseleistung haben wie vor Beginn der Indizierungsänderung. Das Hinzufügen neuer Indizes führt nicht zu unvollständigen oder inkonsistenten Abfrageergebnissen.
Wenn Indizes entfernt und sofort Abfragen ausgeführt werden, die nach den gelöschten Indizes filtern, können die Ergebnisse inkonsistent und unvollständig sein, solange die Indextransformation nicht abgeschlossen ist. Das Abfragemodul stellt keine konsistenten oder vollständigen Ergebnisse für Abfragen bereit, die nach neu entfernten Indizes filtern. Die meisten Entwickler entfernen keine Indizes und fragen sie dann sofort ab, sodass diese Situation unwahrscheinlich ist.
Hinweis
Sie können den Indizierungsfortschritt nachverfolgen.
reIndex-Befehl
Mit dem reIndex-Befehl werden alle Indizes in einer Sammlung neu erstellt. In seltenen Fällen kann das Ausführen des Befehls reIndex die Abfrageleistung verbessern oder andere Indexprobleme in Ihrer Sammlung beheben. Wenn Probleme bei der Indizierung auftreten, versuchen Sie, die Indizes mit dem reIndex-Befehl neu zu erstellen.
Führen Sie den reIndex-Befehl mit der folgenden Syntax aus:
db.runCommand({ reIndex: <collection> })
Verwenden Sie die folgende Syntax, um zu überprüfen, ob das Ausführen des Befehls reIndex die Abfrageleistung in Ihrer Sammlung verbessert:
db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})
Beispielausgabe:
{
"database": "myDB",
"collection": "myCollection",
"provisionedThroughput": 400,
"indexes": [
{
"v": 1,
"key": {
"_id": 1
},
"name": "_id_",
"ns": "myDB.myCollection",
"requiresReIndex": true
},
{
"v": 1,
"key": {
"b.$**": 1
},
"name": "b.$**_1",
"ns": "myDB.myCollection",
"requiresReIndex": true
}
],
"ok": 1
}
Wenn reIndex die Abfrageleistung verbessert, ist requiresReIndex wahr. Wenn reIndex die Abfrageleistung nicht verbessert, wird diese Eigenschaft übersprungen.
Migrieren von Sammlungen mit Indizes
Sie können nur eindeutige Indizes erstellen, wenn die Sammlung keine Dokumente enthält. Beliebte Migrationstools von MongoDB versuchen, nach dem Importieren der Daten eindeutige Indizes zu erstellen. Um dieses Problem zu umgehen, können Sie die entsprechenden Sammlungen und eindeutigen Indizes manuell erstellen, damit das Migrationstool dies nicht versucht. Sie können dieses Verhalten für mongorestore erzielen, indem Sie das --noIndexRestore-Flag an der Befehlszeile verwenden.
Indizierung für MongoDB-Version 3.2
Die Indizierungsfeatures und Standardwerte unterscheiden sich für Azure Cosmos DB-Konten, die die Wire-Protokollversion 3.2 von MongoDB verwenden. Überprüfen Sie die Version Ihres Kontos unter feature-support-36.md#protocol-support, und führen Sie ein Upgrade auf Version 3.6 unter upgrade-version.md durch.
Wenn Sie Version 3.2 verwenden, werden in diesem Abschnitt wichtige Unterschiede zwischen den Versionen 3.6 und höher hervorgehoben.
Löschen der Standardindizes (Version 3.2)
Anders als bei den Versionen 3.6 und höher von Azure Cosmos DB for MongoDB werden in der Version 3.2 alle Eigenschaften standardmäßig indiziert. Verwenden Sie den folgenden Befehl, um diese Standardindizes für eine Sammlung (coll) zu entfernen:
db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Fügen Sie nach dem Entfernen der Standardindizes weitere Indizes wie in Version 3.6 und höher hinzu.
Zusammengesetzte Indizes (Version 3.2)
Zusammengesetzte Indizes verweisen auf mehrere Felder in einem Dokument. Um einen zusammengesetzten Index zu erstellen, führen Sie ein Upgrade auf Version 3.6 oder 4.0 unter upgrade-version.md durch.
Platzhalterindizes (Version 3.2)
Um einen Platzhalterindex zu erstellen, aktualisieren Sie auf Version 4.0 oder 3.6 unter upgrade-version.md.