在 MongoDB 中顯示索引

Mehvish Ashiq 2023年1月30日
  1. 在 MongoDB 中使用 getIndexes() 顯示來自特定集合的索引
  2. 使用 forEach() 顯示 MongoDB 資料庫中所有集合的索引
  3. 顯示來自 MongoDB 中所有資料庫的所有集合的索引
  4. 僅顯示 MongoDB 中所有資料庫的所有集合中的 text 索引
在 MongoDB 中顯示索引

今天,我們將學習如何顯示來自一個集合、一個資料庫的所有集合以及所有資料庫的所有集合的索引。我們還將看到如何從所有資料庫的所有集合中獲取特定型別的索引。

根據專案需求,我們可以使用以下方式之一在 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預設索引。如果你沒有為特定集合建立任何索引,則只會將 _id 視為索引。

為了獲得即時的 mongo shell 幫助,我們還可以使用下面給出的任何命令。

// 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 }

使用 forEach() 顯示 MongoDB 資料庫中所有集合的索引

示例程式碼:

// 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() 一次一個地傳遞給匿名函式。

forEach() 中,我們獲取指定集合的​​所有索引並將它們儲存到 all_indexes 物件中。最後,我們使用 printjson() 在控制檯上列印 all_indexes 物件(在我們的例子中是 mongo shell)。

顯示來自 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() - 我們使用此方法返回資料庫物件,而無需修改 shell 環境中的 db 變數。
  3. getCollectionInfos() - 它用於返回包含檢視或集合資訊的文件陣列,例如,所選資料庫(當前資料庫)的選項和名稱。請記住,我們得到的結果是基於使用者的許可權。
  4. getCollection() - 它為此程式碼返回一個集合物件,儘管它也可以返回一個 view 物件。它在功能上等同於 db.collection_name 語法,但我們使用此方法來訪問不同的收集方法,例如,getIndexes(),如下所述。
  5. getIndexes() - 我們使用此方法獲取一個包含文件列表的陣列,該列表標識和描述特定集合上的所有現有索引,包括隱藏索引

有沒有辦法檢視特定集合的隱藏索引?是的。我們可以使用 listIndexes 檢視它們,如下所示。

這裡,Client 是集合名稱。你可以將其替換為你的集合名稱。

示例程式碼:

// 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 中所有資料庫的所有集合中的 text 索引

示例程式碼:

// 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