MongoDB でインデックスを表示

Mehvish Ashiq 2023年1月30日
  1. MongoDB で getIndexes() を使用して特定のコレクションのインデックスを表示する
  2. MongoDB で forEach() を使用してデータベース内のすべてのコレクションのインデックスを表示する
  3. MongoDB 内のすべてのデータベースのすべてのコレクションからのインデックスを表示する
  4. MongoDB のすべてのデータベースのすべてのコレクションからのみテキストインデックスを表示する
MongoDB でインデックスを表示

今日は、1つのコレクション、データベースのすべてのコレクション、およびすべてのデータベースのすべてのコレクションからインデックスを表示する方法を学習します。また、すべてのデータベースのすべてのコレクションから特定のタイプのインデックスを取得する方法についても説明します。

プロジェクトの要件に応じて、次のいずれかの方法を使用して MongoDB にインデックスを表示できます。このチュートリアルでは、特定のソリューションから一般的なソリューションに移ります。

MongoDB で getIndexes() を使用して特定のコレクションのインデックスを表示する

サンプルコード:

// MongoDB Version 5.0

> db.Client.getIndexes();

出力:

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "shopPosId" : 1
                },
                "name" : "shopPosId_1"
        }
]

上記の出力では、shopPosId フィールドのインデックスがユーザー作成され、_idデフォルトのインデックスである 2つのインデックスを確認できます。特定のコレクションのインデックスを作成していない場合は、_id のみがインデックスとして表示されます。

モンゴシェルの支援を即座に受けるために、以下に示すコマンドのいずれかを使用することもできます。

// MongoDB Version 5.0

> help;
> db.help();
> db.test.help();

stats().indexSizes を使用して、特定のコレクションのそれぞれのサイズのインデックスを表示することもできます。

サンプルコード:

// MongoDB Version 5.0

> db.Client.stats().indexSizes

出力:

{ "_id_" : 36864, "shopPosId_1" : 20480 }

MongoDB で forEach() を使用してデータベース内のすべてのコレクションのインデックスを表示する

サンプルコード:

// MongoDB Version 5.0

> db.getCollectionNames().forEach(function(collection) {
      all_indexes = db.getCollection(collection).getIndexes();
      print("All Indexes for the " + collection + " collection:");
      printjson(all_indexes);
});

出力:

All Indexes for the Client collection:
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "shopPosId" : 1
                },
                "name" : "shopPosId_1"
        }
]
All Indexes for the Shop collection:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All Indexes for the collection1 collection:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All Indexes for the collection2 collection:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All Indexes for the employee collection:
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "_fts" : "text",
                        "_ftsx" : 1
                },
                "name" : "emp_code_text",
                "weights" : {
                        "emp_code" : 1
                },
                "default_language" : "english",
                "language_override" : "language",
                "textIndexVersion" : 3
        }
]
All Indexes for the printjson collection:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All Indexes for the student_courses collection:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]

このサンプルコードは、現在のデータベース内のすべてのコレクションのすべてのインデックスを示しています。このコードスニペットでは、getCollectionNames() メソッドは、forEach() を使用して匿名関数に一度に 1つずつ渡される、選択されたデータベースからすべてのコレクション名を取得します。

forEach() 内で、指定されたコレクションのすべてのインデックスを取得し、それらを all_indexes オブジェクトに保存します。最後に、printjson() を使用して、コンソール(この場合は mongo シェル)に all_indexes オブジェクトを出力します。

MongoDB 内のすべてのデータベースのすべてのコレクションからのインデックスを表示する

サンプルコード:

// MongoDB Version 5.0

> db.adminCommand("listDatabases").databases.forEach(function(database){
      let mdb = db.getSiblingDB(database.name);
      mdb.getCollectionInfos({ type: "collection" }).forEach(function(collection){
          let currentCollection = mdb.getCollection(collection.name);
          let all_indexes = currentCollection.getIndexes();
          print("All indexes on the " + database.name + "." + collection.name + ":");
          printjson(all_indexes)
   });
});

出力:

All indexes on the admin.system.version:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All indexes on the config.system.sessions:
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "lastUse" : 1
                },
                "name" : "lsidTTLIndex",
                "expireAfterSeconds" : 1800
        }
]
All indexes on the local.startup_log:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All indexes on the test.Client:
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "shopPosId" : 1
                },
                "name" : "shopPosId_1"
        }
]
All indexes on the test.Shop:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All indexes on the test.collection1:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All indexes on the test.collection2:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All indexes on the test.employee:
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "_fts" : "text",
                        "_ftsx" : 1
                },
                "name" : "emp_code_text",
                "weights" : {
                        "emp_code" : 1
                },
                "default_language" : "english",
                "language_override" : "language",
                "textIndexVersion" : 3
        }
]
All indexes on the test.printjson:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
All indexes on the test.student_courses:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]

上記のサンプルコードは、すべてのデータベースを繰り返し処理します。各データベースで、すべてのコレクションを繰り返し処理します。

そして、すべてのコレクションで、すべてのインデックスを取得し、それぞれのデータベースとコレクション名でそれらを出力します。

以下は、上記のコードスニペットに使用したすべてのメソッドの簡単な説明です。

  1. adminCommand()-実行するデータベースコンテキストを無視して、admin データベースに対して指定されたデータベースコマンドを実行するヘルパーを提供します。
  2. getSiblingDB()-このメソッドを使用して、シェル環境で db 変数を変更せずにデータベースオブジェクトを返します。
  3. getCollectionInfos()-選択したデータベース(現在のデータベース)のオプションや名前など、ビューまたはコレクション情報を含むドキュメントの配列を返すために使用されます。得られる結果はユーザーの特権に基づいていることを忘れないでください。
  4. getCollection()-view オブジェクトを返すこともできますが、このコードのコレクションオブジェクトを返します。機能的には db.collection_name 構文と同等ですが、このメソッドを使用して、以下で説明する getIndexes() などのさまざまなコレクションメソッドにアクセスします。
  5. getIndexes()-このメソッドを使用して、非表示のインデックスを含む、特定のコレクションの既存のすべてのインデックスを識別および説明するドキュメントのリストを保持する配列を取得します。

特定のコレクションの非表示のインデックスを表示する方法はありますか?はい。以下に示すように、listIndexes を使用してそれらを確認できます。

ここで、クライアントはコレクション名です。これをコレクション名に置き換えることができます。

サンプルコード:

// MongoDB Version 5.0

> db.runCommand (
   {
      listIndexes: "Client"
   }
);

出力:

{
        "cursor" : {
                "id" : NumberLong(0),
                "ns" : "test.Client",
                "firstBatch" : [
                        {
                                "v" : 2,
                                "key" : {
                                        "_id" : 1
                                },
                                "name" : "_id_"
                        },
                        {
                                "v" : 2,
                                "key" : {
                                        "shopPosId" : 1
                                },
                                "name" : "shopPosId_1"
                        }
                ]
        },
        "ok" : 1
}

上記の出力には、インデックスの作成に使用されるキーやオプションなど、インデックス情報を説明する firstBatch が含まれています。MongoDB 4.4 以降の時点で、hidden インデックスオプションは、その値が true の場合にのみ存在します。

MongoDB のすべてのデータベースのすべてのコレクションからのみテキストインデックスを表示する

サンプルコード:

// MongoDB Version 5.0

> db.adminCommand("listDatabases").databases.forEach(function(database){
      let mdb = db.getSiblingDB(database.name);
      mdb.getCollectionInfos({ type: "collection" }).forEach(function(collection){
          let currentCollection = mdb.getCollection(collection.name);
          currentCollection.getIndexes().forEach(function(index){
          let indexValues = Object.values(Object.assign({}, index.key));

          if (indexValues.includes("text")) {
              print("Text index: " + index.name + " on the " +
                  database.name + "." + collection.name);
              printjson(index);
          };
          });
      });
});

出力:

Text index: emp_code_text on the test.employee
{
        "v" : 2,
        "key" : {
                "_fts" : "text",
                "_ftsx" : 1
        },
        "name" : "emp_code_text",
        "weights" : {
                "emp_code" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
}

このコード例は、すべてのデータベースのすべてのコレクションからのみ text タイプインデックスをターゲットにしている点を除いて、前のコード例と似ています。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - MongoDB Index