Freigeben über


Erstellen von Wildcardindizes in Azure Cosmos DB für MongoDB vCore

GILT FÜR: MongoDB-vCore

Workloads, die über einen unvorhersehbaren Satz von Feldern im Schema verfügen, können Mithilfe von Platzhalterindizes 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, wodurch die Indizierung aller Felder über einen einzelnen Befehl vereinfacht wird, ist einfacher als jedes Feld einzeln zu indizieren.
  • 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.

Indizieren aller Felder

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

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

Wichtig

Für große Sammlungen wird die Verwendung des alternativen Ansatzes empfohlen, der weiter unten in diesem Dokument definiert wird.

Einschließen oder Ausschließen bestimmter Felder

Platzhalterindizes können auch auf bestimmte Felder beschränkt werden, und bestimmte Felder können von der Indizierung ausgeschlossen werden. Es folgt ein Beispiel im folgenden JSON-Code.

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

Das Indizierungsverhalten kann gesteuert werden: Das Beispiel schränkt das Erstellen von Indizes für die Felder firstName, lastName und timeInOrgInYears ein.

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

Im wildcardProjection-Dokument gibt der Wert 0 oder 1 an, ob das Feld in die Indizierung eingeschlossen (1) oder aus ihr ausgeschlossen (0) ist.

Alternative zum Indizieren aller Felder

In diesem Beispiel wird eine einfache Problemumgehung beschrieben, um den Aufwand zu minimieren, der zum Erstellen einzelner Indizes erforderlich ist, bis die Indizierung in Azure Cosmos DB für MongoDB vCore allgemein verfügbar ist.

Betrachten Sie das JSON-Dokument unterhalb:

{
    "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 wird, vereinfacht die Indizierung von Feldern in größeren Dokumenten. Die JAR nimmt ein JSON-Dokument als Input, analysiert das Dokument und führt createIndex-Befehle für jedes Feld ohne die Notwendigkeit eines Eingriffs durch einen Benutzer aus.

Voraussetzungen

Java 21

Nachdem der virtuelle Computer bereitgestellt wurde, verwenden Sie SSH, um eine Verbindung mit dem Computer herzustellen, und installieren 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, welches 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. Die integrierte ausführbare JAR mit dem Namen azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar ist bereits im runnableJar/-Ordner enthalten. Die JAR kann ausgeführt werden, indem die folgenden erforderlichen Parameter festgelegt werden:

  • Azure Cosmos DB für MongoDB vCore-Clusterverbindungszeichenfolge mit dem Benutzernamen und Kennwort, die beim Bereitstellen des Clusters verwendet wurden
  • Die Azure Cosmos DB für mongoDB vCore-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 „cosmicworks“ 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