次の方法で共有


Azure Cosmos DB for MongoDB 仮想コアでワイルドカード インデックスを作成する

適用対象: MongoDB 仮想コア

スキーマ内に予期しないフィールド セットがあるワークロードでは、ワイルドカード インデックスを使用して、任意または不明なフィールドに対するクエリをサポートし、パフォーマンスを最適化できます。

ワイルドカード インデックス作成は、次のシナリオで役立ちます。

  • ドキュメント内の任意のフィールドでフィルター処理するクエリで、各フィールドのインデックスを個別に作成するよりも簡単に 1 つのコマンドですべてのフィールドのインデックスを作成する。
  • ドキュメント内のほとんどのフィールドでフィルター処理するクエリで、ほとんどのフィールドのインデックスを個別に作成するよりも簡単に 1 つのコマンドで少数のフィールドを除くすべてのフィールドのインデックスを作成する。

すべてのフィールドのインデックス作成

不明や動的な名前を持つフィールドを含め、使用可能なすべてのドキュメント フィールドに対するクエリを容易にするワイルドカード インデックスを設定します。

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

重要

大規模なコレクションの場合は、このドキュメントで後述する代替方法を使用することをお勧めします。

特定のフィールドを含めるまたは除外する

ワイルドカード インデックスは、特定のフィールドをインデックスの対象から除外しながら、特定のフィールドに制限することもできます。 次の Json のサンプルを確認してみましょう。

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

インデックス作成の動作を制御できます。この例では、firstNamelastNametimeInOrgInYears フィールドでのインデックスの作成を制限します。

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

wildcardProjection ドキュメントでは、値 0 または 1 は、フィールドがインデックス作成から含まれるか (1) または除外されるか (0) を示します。

すべてのフィールドのインデックス作成の代替方法

このサンプルでは、Azure Cosmos DB for MongoDB 仮想コアでワイルドカード インデックス作成が一般公開されるまで個別のインデックスを作成するために必要な作業を最小限に抑えるための簡単な回避策について説明します。

以下の JSON ドキュメントについて考えてみましょう。

{
    "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
        }
    ]
}

ワイルドカード インデックス作成を使用すると、次のインデックスが内部で作成されます。

  • 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})

このサンプル ドキュメントでは、明示的にインデックスを作成する必要があるフィールドの組み合わせは 10 個だけですが、数百または数千のフィールドが含まれる大規模なドキュメントでフィールドのインデックスを個別に作成するときに面倒でエラーが発生しやすくなります。

このドキュメントの残りの部分で詳しく説明する JAR ファイルを使用すると、大規模なドキュメントのフィールドのインデックス作成が簡単になります。 JAR はサンプル JSON ドキュメントを入力として受け取り、ドキュメントを解析し、各フィールドに対して createIndex コマンドを実行し、ユーザーの介入が必要ありません。

前提条件

Java 21

仮想マシンがデプロイされたら、SSH を使用してマシンに接続し、次のコマンドを使用して CQLSH をインストールします。

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

すべてのフィールドに対して個別のインデックスを作成するサンプル JAR

Java サンプルを含むリポジトリを複製して、JSON ドキュメントの構造内の各フィールドを反復処理し、ドキュメント内の各フィールドに対して createIndex 操作を発行します。

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

ソリューションに変更が加えられない場合、複製したリポジトリをビルドする必要はありません。 azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar という名前のビルドされた実行可能 JAR が runnableJar/ フォルダーに既に含まれています。 JAR は、次の必須パラメーターを指定して実行できます。

  • Azure Cosmos DB for MongoDB 仮想コア クラスター接続文字列と、クラスターのプロビジョニング時に使用されたユーザー名とパスワード
  • Azure Cosmos DB for MongoDB 仮想コア データベース
  • インデックスを作成するコレクション
  • コレクションのドキュメント構造を持つ JSON ファイルの場所。 このドキュメントは JAR ファイルによって解析され、すべてのフィールドを抽出し、個々の createIndex 操作を発行します。
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

createIndex 操作の状態を追跡する

JAR ファイルは、各 createIndex 操作からの応答を待機しないように設計されています。 インデックスはサーバー上で非同期的に作成され、クラスターでのインデックス作成操作の進行状況を追跡できます。

このサンプルを検討して、'cosmicworks' データベースのインデックス作成の進行状況を追跡します。

use cosmicworks;
db.currentOp()

createIndex 操作が進行中の場合、応答は次のようになります。

{
  "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
}

次のステップ