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.
Indizes sind Strukturen, die die Datenempfangsgeschwindigkeit verbessern, indem der schnelle Zugriff auf Felder in einer Auflistung ermöglicht wird. Sie arbeiten, indem sie einen sortierten Satz von Zeigern auf Daten erstellen, häufig basierend auf Schlüsselfeldern. Azure DocumentDB verwendet Indizes in mehreren Kontexten, einschließlich Abfrage-Pushdown, eindeutige Einschränkungen und Sharding.
Von Bedeutung
Das Feld "_id" ist das einzige Feld, das standardmäßig indiziert ist und die maximale Größe des Felds sein 2 KBkann. Es wird empfohlen, zusätzliche Indizes basierend auf Abfragefiltern und Prädikaten hinzuzufügen, um die Leistung zu optimieren.
Indextypen
Lassen Sie uns aus Gründen der Einfachheit ein Beispiel für eine Bloganwendung mit der folgenden Einrichtung betrachten:
-
Datenbankname:
cosmicworks -
Sammlungsname:
products
In dieser Beispielanwendung werden Artikel als Dokumente mit der folgenden Struktur gespeichert. Alle weiter angeführten Beispiele nutzen die Struktur dieser Sammlung.
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure DocumentDB - A Game Changer",
"content": "Azure DocumentDB is a globally distributed, multi-model database service.",
"author": {lastName: "Doe", firstName: "John"},
"category": "Technology",
"launchDate": ISODate("2024-06-24T10:08:20.000Z"),
"published": true
}
Einzelfeldindizes
Einzelne Feldindizes speichern Informationen aus einem einzelnen Feld in einer Auflistung. Die Sortierreihenfolge des Einzelfeldindexes ist unerheblich.
_id Das Feld bleibt standardmäßig indiziert.
Azure DocumentDB unterstützt das Erstellen von Index wie folgt:
- Dokumentfelder der obersten Ebene.
- Eingebettetes Dokument.
- Felder innerhalb eines eingebetteten Dokuments.
Mit dem folgenden Befehl wird ein einzelner Feldindex für das Feld author erstellt, und der folgende Befehl erstellt ihn in einem eingebetteten Feld firstName.
use cosmicworks
db.products.createIndex({"author": 1})
// indexing embedded property
db.products.createIndex({"author.firstName": -1})
Eine Abfrage kann mehrere einzelne Feldindizes verwenden, sofern verfügbar.
Hinweis
Azure DocumentDB ermöglicht das Erstellen von maximal 64 Indizes für eine Auflistung. Abhängig von der Stufe können wir auf Anfrage eine Erweiterung auf bis zu 300 Indizes planen.
Zusammengesetzte Indizes
Zusammengesetzte Indizes verbessern die Datenbankleistung, indem sie eine effiziente Abfrage und Sortierung basierend auf mehreren Feldern innerhalb von Dokumenten ermöglichen. Durch diese Optimierung wird die Notwendigkeit reduziert, ganze Sammlungen zu scannen und den Datenabruf und die Organisation zu beschleunigen.
Mit dem folgenden Befehl wird ein zusammengesetzter Index für die Felder author und launchDate in entgegengesetzter Sortierreihenfolge erstellt.
use cosmicworks
db.products.createIndex({"author":1, "launchDate":-1})
Order der Felder wirkt sich auf die Selektivität oder die Verwendung des Index aus. Die find Abfrage würde den erstellten Index nicht verwenden.
use cosmicworks
db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})
Einschränkungen
- Maximal 32 Felder\Pfade innerhalb eines zusammengesetzten Indexes.
Partielle Indizes
Indizes mit einem zugeordneten Abfragefilter, der beschreibt, wann ein Ausdruck im Index generiert werden soll.
use cosmicworks
db.products.createIndex (
{ "author": 1, "launchDate": 1 },
{ partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)
Einschränkungen
- Partielle Indizes unterstützen
ORDER BYoderUNIQUEnur, wenn der Filter qualifiziert ist.
Textindizes
Textindizes sind spezielle Datenstrukturen, die textbasierte Abfragen optimieren, wodurch sie schneller und effizienter werden.
Verwenden Sie die createIndex Methode mit der text Option zum Erstellen eines Textindexes für das title Feld.
use cosmicworks;
db.products.createIndex({ title: "text" })
Hinweis
Obwohl Sie nur einen Textindex pro Sammlung definieren können, können Sie in Azure DocumentDB Textindizes in Kombination mit mehreren Feldern erstellen, damit Sie Textsuchen in verschiedenen Feldern in Ihren Dokumenten ausführen können.
Konfigurieren von Textindexoptionen
Textindizes in Azure DocumentDB verfügen über mehrere Optionen zum Anpassen ihres Verhaltens. Sie können z. B. die Sprache für die Textanalyse angeben, Gewichtungen festlegen, um bestimmte Felder zu priorisieren, und die Suche ohne Berücksichtigung von Groß- und Kleinschreibung konfigurieren. Hier ist ein Beispiel für das Erstellen eines Textindexes mit Optionen:
Erstellen Sie einen Index, um die Suche in den
titleFeldern undcontentFeldern mit Unterstützung für englischen Sprachen zu unterstützen. Weisen Sie demtitleFeld außerdem höhere Gewichtungen zu, um es in Suchergebnissen zu priorisieren.use cosmicworks db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
Hinweis
Wenn ein Client eine Textsuchabfrage mit dem Begriff "DocumentDB" ausführt, wird die Bewertung für jedes Dokument in der Auflistung basierend auf dem Vorhandensein und der Häufigkeit des Ausdrucks sowohl in den Feldern "Title" als auch "content" berechnet, wobei dem Feld "Titel" aufgrund seiner höheren Gewichtung eine höhere Bedeutung zugewiesen wird.
Ausführen einer Textsuche mithilfe eines Textindexes
Nachdem der Textindex erstellt wurde, können Sie Textsuchen mit dem Operator "text" in Ihren Abfragen ausführen. Der Textoperator nimmt eine Suchzeichenfolge und gleicht sie mit dem Textindex ab, um relevante Dokumente zu finden.
Führen Sie eine Textsuche für den Ausdruck
DocumentDBaus.use cosmicworks db.products.find( { $text: { $search: "DocumentDB" } } )Optional können Sie den
$metaProjektionsoperator zusammen mit demtextScoreFeld in einer Abfrage verwenden, um die Gewichtung anzuzeigen.use cosmicworks db.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
Einschränkungen
- Für eine Auflistung kann nur ein Textindex definiert werden.
- Sortiervorgänge können die Reihenfolge des Textindexes in MongoDB nicht verwenden.
- Hinweis() wird nicht in Kombination mit einer Abfrage, die den $text-Ausdruck verwendet, unterstützt.
- Textindizes können relativ groß sein, was im Vergleich zu anderen Indextypen erheblichen Speicherplatz verbraucht.
WildCard-Indizes
Index für ein einzelnes Feld, indiziert alle Pfade unter dem field , ausgenommen andere Felder, die sich auf derselben Ebene befinden. Beispiel: für das folgende Beispieldokument
{
"children":
{
"familyName": "Merriam",
"pets": { "details": {“name”: "Goofy", ”age”: 3} }
}
}
Beim Erstellen eines Index für { "pets.$**": 1 } wird ein Index zu Details und Unterdokumenteigenschaften erstellt, aber kein Index für „familyName“.
Einschränkungen
- Wildcardindizes können keine eindeutigen Indizes unterstützen.
- Wildcard-Indizes unterstützen Pushdowns von
ORDER BYnicht, es sei denn, der Filter enthält nur Pfade, die im Wildcard-Index vorhanden sind, weil sie keine nicht definierten Elemente indizieren. - Ein zusammengesetzter Platzhalterindex kann nur
onePlatzhalterbegriff undoneoder mehr Indexbegriffe enthalten.{ "pets.$**": 1, “familyName”: 1 }
Räumliche Indizes
Geospatialindizes unterstützen Abfragen zu Daten, die als GeoJSON-Objekte oder ältere Koordinatenpaare gespeichert sind. Sie können geospatiale Indizes verwenden, um die Leistung für Abfragen von Geospatialdaten zu verbessern oder bestimmte geospatiale Abfragen auszuführen.
Azure DocumentDB bietet zwei Arten von geospatialen Indizes:
- 2dsphere-Indizes, die Abfragen unterstützen, die Geometrie auf einer Kugel interpretieren.
- 2d-Indizes, die Abfragen unterstützen, die Geometrie auf einer flachen Oberfläche interpretieren.
2d-Indizes
2d-Indizes werden nur mit legacy-Koordinatenpaarstil zum Speichern von Geospatialdaten unterstützt.
Verwenden Sie die createIndex Methode mit der 2d Option zum Erstellen eines geospatialen Indexes für das location Feld.
db.places.createIndex({ "location": "2d"});
Einschränkungen
- Nur
oneStandortfeld kann Teil des2dIndexes sein, und nuroneein anderes Nicht-Geospatialfeld kann Teil descompound 2dIndexes sein.db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })
2dsphere-Indizes
2dsphere Indizes unterstützen Geospatialabfragen auf einer erdähnlichen Kugel. Sie kann sowohl GeoJSON-Objekte als auch legacykoordinatenpaare unterstützen.
2dSphere Indizes arbeiten mit dem GeoJSON-Stil der Datenspeicherung. Wenn Legacy-Punkte gefunden werden, werden sie in GeoJSON-Punkte konvertiert.
Verwenden Sie die createIndex Methode mit der 2dsphere Option zum Erstellen eines geospatialen Indexes für das location Feld.
db.places.createIndex({ "location": "2dsphere"});
2dsphere Indizes ermöglichen das Erstellen von Indizes für mehrere Geospatial- und nicht-geospatiale Datenfelder.
db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })
Einschränkungen
Ein zusammengesetzter Index, der einen regulären Index und einen geospatialen Index verwendet, wird nicht unterstützt. Das Erstellen eines der geospatialen Indizes führt zu Fehlern.
// Compound Regular & 2dsphere indexes are not supported yet db.collection.createIndex({a: 1, b: "2dsphere"}) // Compound 2d indexes are not supported yet db.collection.createIndex({a: "2d", b: 1})Polygone mit Löchern funktionieren nicht. Das Einfügen eines Polygons mit Loch ist nicht eingeschränkt, auch wenn die
$geoWithin-Abfrage für folgende Szenarien fehlschlägt:Wenn die Abfrage selbst ein Polygon mit Löchern enthält
coll.find( { "b": { "$geoWithin": { "$geometry": { "coordinates": [ [ [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0] ], [ [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5] ] ], "type": "Polygon" } } } }) // MongoServerError: $geoWithin currently doesn't support polygons with holesWenn es ein nicht gefiltertes Dokument mit Polygonen mit Löchern gibt.
[mongos] test> coll.find() [ { _id: ObjectId("667bf7560b4f1a5a5d71effa"), b: { type: 'Polygon', coordinates: [ [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ], [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ] ] } } ] // MongoServerError: $geoWithin currently doesn't support polygons with holesDas Feld
keyist bei der Verwendung vongeoNearPflicht.[mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }]) // MongoServerError: $geoNear requires a 'key' option as a String
Nächste Schritte
- Erfahren Sie mehr über die Indizierung bewährter Methoden für die effizientesten Ergebnisse.
- Informationen zur Hintergrundindizierung
- Hier erfahren Sie, wie Sie mit der Textindizierung arbeiten können.
- Hier erfahren Sie mehr über die Indizierung von Wildcards.