在 MongoDB 中顯示索引
-
在 MongoDB 中使用
getIndexes()
顯示來自特定集合的索引 -
使用
forEach()
顯示 MongoDB 資料庫中所有集合的索引 - 顯示來自 MongoDB 中所有資料庫的所有集合的索引
-
僅顯示 MongoDB 中所有資料庫的所有集合中的
text
索引
今天,我們將學習如何顯示來自一個集合、一個資料庫的所有集合以及所有資料庫的所有集合的索引。我們還將看到如何從所有資料庫的所有集合中獲取特定型別的索引。
根據專案需求,我們可以使用以下方式之一在 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_" } ]
上面給出的示例程式碼將遍歷所有資料庫。在每個資料庫中,它遍歷所有集合。
在每個集合中,它獲取所有索引並使用它們各自的資料庫和集合名稱列印它們。
以下是我們用於上述程式碼片段的所有方法的簡要說明。
adminCommand()
- 它提供幫助器來針對admin
資料庫執行給定的資料庫命令,忽略它執行的資料庫上下文。getSiblingDB()
- 我們使用此方法返回資料庫物件,而無需修改 shell 環境中的db
變數。getCollectionInfos()
- 它用於返回包含檢視或集合資訊的文件陣列,例如,所選資料庫(當前資料庫)的選項和名稱。請記住,我們得到的結果是基於使用者的許可權。getCollection()
- 它為此程式碼返回一個集合物件,儘管它也可以返回一個 view 物件。它在功能上等同於db.collection_name
語法,但我們使用此方法來訪問不同的收集方法,例如,getIndexes()
,如下所述。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
型別索引。