Freigeben über


Erstellen von Wildcardindizes in Azure DocumentDB

Arbeitsauslastungen, die über einen unvorhersehbaren Satz von Feldern im Schema verfügen, können Mithilfe von Wildcardindizes Abfragen für beliebige oder unbekannte Felder unterstützen, um eine optimierte Leistung zu erzielen.

Die Indizierung von Wildcards kann in den folgenden Szenarien hilfreich sein:

  • Abfragen, die nach einem beliebigen Feld im Dokument filtern, erleichtern die Indizierung aller Felder durch einen einzigen Befehl, anstatt jedes Feld einzeln indizieren zu müssen.
  • Abfragen, die nach den meisten Feldern im Dokument filtern, wodurch die Indizierung aller bis auf weniger Felder über einen einzelnen Befehl vereinfacht wird, ist einfacher als die meisten Felder einzeln zu indizieren.

Indizierung aller Felder

Richten Sie einen Wildcardindex ein, um Abfragen für alle möglichen Dokumentfelder zu vereinfachen, einschließlich derjenigen mit unbekannten oder dynamischen Namen.

db.collection.createIndex( { "$**": 1 } )

Von Bedeutung

Für große Sammlungen empfehlen wir die Verwendung alternativer Ansätze, die weiter unten in diesem Dokument definiert wurden.

Einschließen oder Ausschließen bestimmter Felder

Wildcardindizes können auch auf bestimmte Felder beschränkt werden, während bestimmte Felder von der Indizierung ausgeschlossen werden. Sehen wir uns ein Beispiel für den folgenden Json-Code an.

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "timeInOrgInYears": 7
}

Wir können das Indizierungsverhalten steuern, das Beispiel schränkt das Erstellen von Indizes für firstName,lastName & timeInOrgInYears field ein.

db.collection.createIndex( { "$**": 1 },
                           {"wildcardProjection" : {  "firstName": 0
                                                    , "lastName": 0
                                                    , "companyName": 1
                                                    , "division": 1
                                                    , "timeInOrgInYears": 0
                                                   }
                           }
                         )

Im Wildcard-Projektionsdokument zeigt der Wert 0 oder 1 an, ob das Feld in die Indizierung einbezogen (1) oder ausgeschlossen (0) wird.

Alternative zur Indexierung aller Felder

In diesem Beispiel wird eine einfache Umgehungslösung beschrieben, um den Aufwand zu minimieren, der zum Erstellen einzelner Indizes erforderlich ist, bis die Wildcard-Indizierung in Azure DocumentDB allgemein freigegeben ist.

Betrachten Sie das json-Dokument unten:

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7,
    "roles": [
        {
            "teamName" : "Windows",
            "teamSubName" "Operating Systems",
            "timeInTeamInYears": 3
        },
        {
            "teamName" : "Devices",
            "teamSubName" "Surface",
            "timeInTeamInYears": 2
        },
        {
            "teamName" : "Devices",
            "teamSubName" "Surface",
            "timeInTeamInYears": 2
        }
    ]
}

Die folgenden Indizes werden im Hintergrund erstellt, wenn die Indizierung von Wildcards verwendet wird.

  • db.collection.createIndex({"firstName", 1})
  • db.collection.createIndex({"lastName", 1})
  • db.collection.createIndex({"companyName", 1})
  • db.collection.createIndex({"division", 1})
  • db.collection.createIndex({"subDivision", 1})
  • db.collection.createIndex({ "timeInOrgInYears", 1 })
  • db.collection.createIndex({"subDivision", 1})
  • db.collection.createIndex({"roles.teamName", 1})
  • db.collection.createIndex({"roles.teamSubName", 1})
  • db.collection.createIndex({"roles.timeInTeamInYears", 1})

Während in diesem Beispieldokument nur eine Kombination aus 10 Feldern explizit indiziert werden muss, können größere Dokumente mit Hunderten oder Tausenden von Feldern mühsam und fehleranfällig werden, wenn Felder einzeln indiziert werden.

Die jar-Datei, die im restlichen Dokument beschrieben ist, vereinfacht die Indizierung von Feldern in größeren Dokumenten. Das Jar nimmt ein Beispiel-JSON-Dokument als Eingabe, analysiert das Dokument und führt für jedes Feld createIndex-Befehle aus, ohne dass eine Benutzereingabe erforderlich ist.

Voraussetzungen

Java 21

Nachdem der virtuelle Computer bereitgestellt wurde, verwenden Sie SSH, um eine Verbindung mit dem Computer herzustellen, und installieren Sie CQLSH mithilfe der folgenden Befehle:

# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk

Beispiel-JAR zum Erstellen einzelner Indizes für alle Felder

Klonen Sie das Repository, das das Java-Beispiel enthält, um jedes Feld in der Struktur des JSON-Dokuments zu durchlaufen, und geben Sie createIndex-Vorgänge für jedes Feld im Dokument aus.

git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git

Das geklonte Repository muss nicht erstellt werden, wenn keine Änderungen an der Lösung vorgenommen werden müssen. Der integrierte runnable Jar mit dem Namen azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar ist bereits im RunnableJar/-Ordner enthalten. Die JAR-Datei kann ausgeführt werden, indem die folgenden erforderlichen Parameter angegeben werden:

  • Azure DocumentDB-Cluster-Verbindungszeichenfolge mit dem Benutzernamen und Passwort, die bei der Bereitstellung des Clusters verwendet wurden.
  • Die Azure DocumentDB-Datenbank
  • Die Sammlung, die indiziert werden soll
  • Der Speicherort der JSON-Datei mit der Dokumentstruktur für die Sammlung. Dieses Dokument wird von der Jar-Datei analysiert, um jedes Feld zu extrahieren und einzelne createIndex-Vorgänge auszugeben.
java -jar azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar mongodb+srv://<user>:<password>@abinav-test-benchmarking.global.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000 cosmicworks employee sampleEmployee.json

Nachverfolgen des Status eines createIndex-Vorgangs

Die Jar-Datei ist so konzipiert, dass nicht auf eine Antwort von jedem createIndex-Vorgang gewartet wird. Die Indizes werden asynchron auf dem Server erstellt, und der Fortschritt des Indexbuildvorgangs auf dem Cluster kann nachverfolgt werden.

Betrachten Sie dieses Beispiel, um den Indizierungsfortschritt in der Datenbank "kosmischen Werke" nachzuverfolgen.

use cosmicworks;
db.currentOp()

Wenn ein createIndex-Vorgang ausgeführt wird, sieht die Antwort wie folgt aus:

{
  "inprog": [
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451493:1719209762286363",
      "op_prefix": 30000451493,
      "currentOpTime": "2024-06-24T06:16:02.000Z",
      "secs_running": 0,
      "command": { "aggregate": "" },
      "op": "command",
      "waitingForLock": false
    },
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451876:1719209638351743",
      "op_prefix": 30000451876,
      "currentOpTime": "2024-06-24T06:13:58.000Z",
      "secs_running": 124,
      "command": { "createIndexes": "" },
      "op": "workerCommand",
      "waitingForLock": false,
      "progress": {},
      "msg": ""
    }
  ],
  "ok": 1
}

Nächste Schritte