Verwalten der Indizierung in Azure Cosmos DB for MongoDB vCore
GILT FÜR: MongoDB-vCore
Indizes sind Strukturen, die die Datenabrufgeschwindigkeit verbessern, indem schneller Zugriff auf Felder in einer Sammlung ermöglicht wird. Dazu wird ein sortierter Satz von Zeigern auf Daten erstellt, häufig basierend auf Schlüsselfeldern. Azure Cosmos DB for MongoDB vCore verwendet Indizes in verschiedenen Kontexten, einschließlich Abfrage-Pushdown, eindeutige Einschränkungen und Sharding.
Wichtig
Das Feld „_id“ ist das einzige Feld, das standardmäßig indiziert ist, und die maximale Größe des Felds kann 2 KB
betragen. Es wird empfohlen, zusätzliche Indizes basierend auf Abfragefiltern und Prädikaten hinzuzufügen, um die Leistung zu optimieren.
Indextypen
Betrachten wir der Einfachheit halber ein Beispiel für eine Bloganwendung mit der folgenden Einrichtung:
- Datenbankname:
cosmicworks
- Auflistungsname:
products
In dieser Beispielanwendung werden Artikel als Dokumente mit der folgenden Struktur gespeichert. In allen später zitierten Beispielen wird die Struktur dieser Sammlung weiter verwendet.
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure Cosmos DB - A Game Changer",
"content": "Azure Cosmos DB 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
Einzelfeldindizes speichern Informationen aus einem einzelnen Feld in einer Auflistung. Die Sortierreihenfolge des Einzelfeldindexes ist unerheblich. Das Feld _id
bleibt standardmäßig indiziert.
Azure Cosmos DB for MongoDB vCore unterstützt das Erstellen von Indizes für Folgendes:
- Dokumentfelder auf der obersten Ebene.
- Eingebettetes Dokument.
- Felder innerhalb eines eingebetteten Dokuments.
Mit dem folgenden Befehl wird ein Einzelfeldindex für das Feld author
erstellt, und der folgende Befehl erstellt ihn im eingebetteten Feld firstName
.
use cosmicworks
db.products.createIndex({"author": 1})
// indexing embedded property
db.products.createIndex({"author.firstName": -1})
Bei einer Abfrage können mehrere Einzelfeldindizes verwendet werden, soweit verfügbar.
Hinweis
Azure Cosmos DB for MongoDB vCore ermöglicht das Erstellen von maximal 64 Indizes für eine Sammlung. Je nach Dienstebene kann auf Anfrage eine Erweiterung auf bis zu 300 Indizes geplant werden.
Zusammengesetzte Indizes
Zusammengesetzte Indizes verbessern die Datenbankleistung, indem effiziente Abfragen und Sortierungen basierend auf mehreren Feldern in Dokumenten ermöglicht werden. Durch diese Optimierung wird die Notwendigkeit reduziert, ganze Sammlungen zu scannen, wodurch der Datenabruf und die Organisation beschleunigt werden.
Der folgende Befehl erstellt einen zusammengesetzten Index für die Felder author
und launchDate
in umgekehrter Sortierreihenfolge.
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")}})
Begrenzungen
- Maximal 32 Felder/Pfade innerhalb eines zusammengesetzten Index.
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") } } }
)
Begrenzungen
- Partielle Indizes unterstützen
ORDER BY
oderUNIQUE
nur, wenn der Filter qualifiziert ist.
Textindizes
Textindizes sind spezielle Datenstrukturen, die textbasierte Abfragen optimieren und so schneller und effizienter machen.
Verwenden Sie die createIndex
-Methode mit der text
-Option zum Erstellen eines Textindex für das title
-Feld.
use cosmicworks;
db.products.createIndex({ title: "text" })
Hinweis
Obwohl Sie nur einen Textindex pro Sammlung definieren können, ermöglicht Ihnen Azure Cosmos DB for MongoDB vCore das Erstellen von Textindizes für mehrere Felder, damit Sie Textsuchen in verschiedenen Feldern in Ihren Dokumenten durchführen können.
Konfigurieren von Textindexoptionen
Bei Textindizes in Azure Cosmos DB for MongoDB vCore gibt es mehrere Optionen zum Anpassen des Verhaltens. Beispielsweise können Sie die Sprache für die Textanalyse angeben, Gewichtungen festlegen, um bestimmte Felder zu priorisieren, und Suchvorgänge ohne Beachtung der Groß-/Kleinschreibung konfigurieren. Hier ist ein Beispiel für das Erstellen eines Textindexes mit Optionen:
Erstellen Sie einen Index, um die Suche nach den Feldern
title
undcontent
mit Unterstützung für die englische Sprache zu unterstützen. Weisen Sie außerdem dem Feldtitle
höhere Gewichtungen zu, um es in den 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 „Cosmos DB“ ausführt, wird die Bewertung für jedes Dokument in der Auflistung basierend auf dem Vorhandensein und der Häufigkeit des Begriffs in den Feldern „title“ und „content“ berechnet, wobei dem Feld „title“ aufgrund seiner höheren Gewichtung eine höhere Bedeutung beigemessen wird.
Ausführen einer Textsuche mithilfe eines Textindexes
Sobald der Textindex erstellt wurde, können Sie Textsuchen mithilfe des Operators „text“ in Ihren Abfragen durchführen. Der Textoperator verwendet eine Suchzeichenfolge und gleicht sie mit dem Textindex ab, um relevante Dokumente zu finden.
Führen Sie eine Textsuche nach dem Ausdruck
Cosmos DB
aus.use cosmicworks db.products.find( { $text: { $search: "Cosmos DB" } } )
Verwenden Sie in einer Abfrage optional den
$meta
-Projektionsoperator zusammen mit demtextScore
-Feld, um die Gewichtung anzuzeigen.use cosmicworks db.products.find( { $text: { $search: "Cosmos DB" } }, { score: { $meta: "textScore" } } )
Begrenzungen
- Für eine Auflistung kann nur ein Textindex definiert werden.
- Textindizes unterstützen einfache Textsuchen und bieten noch keine erweiterten Suchfunktionen wie z. B. reguläre Ausdrücke.
- Sortiervorgänge können nicht die Sortierung des Textindexes in MongoDB nutzen.
- „Hint()“ wird in Kombination mit einer Abfrage über den Ausdruck „$text“ nicht unterstützt.
- Textindizes können relativ groß sein und im Vergleich zu anderen Indextypen viel Speicherplatz belegen.
Platzhalterindizes
Index für ein einzelnes Feld, indiziert alle Pfade unter field
, mit Ausnahme anderer Felder, die sich auf derselben Ebene befinden. Für das folgende Beispieldokument gilt beispielsweise:
{
"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“.
Begrenzungen
- Platzhalterindizes können keine eindeutigen Indizes unterstützen.
- Platzhalterindizes unterstützen keine Pushdowns von
ORDER BY
, es sei denn, der Filter enthält nur Pfade, die im Platzhalter vorhanden sind (da sie keine nicht definierten Elemente indizieren). - Ein zusammengesetzter Platzhalterindex kann nur
one
Platzhalterbegriff undone
oder mehr Indexbegriffe enthalten.{ "pets.$**": 1, “familyName”: 1 }
Räumliche Indizes
Räumliche Indizes unterstützen Abfragen zu Daten, die als GeoJSON-Objekte oder ältere Koordinatenpaare gespeichert sind. Sie können räumliche Indizes verwenden, um die Leistung für Abfragen von Geodaten zu verbessern oder bestimmte räumliche Abfragen auszuführen.
Azure Cosmos DB for MongoDB vCore bietet zwei Arten von räumlichen 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 dem Legacy-Koordinatenpaarformat zum Speichern von Geodaten unterstützt.
Verwenden Sie die createIndex
-Methode mit der 2d
-Option zum Erstellen eines räumlichen Index für das location
-Feld.
db.places.createIndex({ "location": "2d"});
Begrenzungen
- Nur ein
one
-Standortfeld kann Teil des2d
-Index sein, und nurone
anderes nicht-räumliches Feld kann Teil descompound 2d
-Indexdb.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })
sein
2dsphere-Indizes
2dsphere
-Indizes unterstützen räumliche Abfragen auf einer erdähnlichen Kugel. Sie können sowohl GeoJSON-Objekte als auch Legacy-Koordinatenpaare unterstützen. 2dSphere
-Indizes arbeiten mit dem GeoJSON-Format für das Speichern von Daten. Wenn ältere Punkte gefunden werden, werden sie in GeoJSON-Punkte konvertiert.
Verwenden Sie die createIndex
-Methode mit der 2dsphere
-Option zum Erstellen eines räumlichen Index für das location
-Feld.
db.places.createIndex({ "location": "2dsphere"});
2dsphere
-Indizes ermöglichen das Erstellen von Indizes für mehrere räumliche und nicht-räumliche Datenfelder.
db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })
Begrenzungen
Ein Index, der sich aus einem regulären Index und einem räumlichen Index zusammensetzt, wird nicht unterstützt. Das Erstellen eines der räumlichen 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 Polygone 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 holes
Wenn 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 holes
Das
key
-Feld ist bei Verwendung vongeoNear
obligatorisch.[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 Bewährten Methoden der Indizierung für die effizientesten Ergebnisse.
- Erfahren Sie mehr über Hintergrundindizierung
- Hier erfahren Sie, wie Sie mit Textindizierung arbeiten können.
- Hier erfahren Sie mehr über Platzhalterindizierung.