在 MongoDB 中显示索引

Mehvish Ashiq 2023年1月30日 2022年6月15日
  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 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