MongoDB에서 인덱스 표시

Mehvish Ashiq 2023년1월30일
  1. getIndexes()를 사용하여 MongoDB의 특정 컬렉션에서 인덱스 표시
  2. forEach()를 사용하여 MongoDB의 데이터베이스에 있는 모든 컬렉션의 인덱스 표시
  3. MongoDB에 있는 모든 데이터베이스의 모든 컬렉션에서 인덱스 표시
  4. MongoDB에 있는 모든 데이터베이스의 모든 컬렉션에서 text 인덱스만 표시
MongoDB에서 인덱스 표시

오늘 우리는 하나의 컬렉션, 데이터베이스의 모든 컬렉션, 모든 데이터베이스의 모든 컬렉션에서 인덱스를 표시하는 방법을 배웁니다. 또한 모든 데이터베이스의 모든 컬렉션에서 특정 유형의 인덱스를 가져오는 방법도 살펴봅니다.

프로젝트 요구 사항에 따라 다음 방법 중 하나를 사용하여 MongoDB에서 인덱스를 표시할 수 있습니다. 이 자습서에서는 특정 솔루션에서 일반 솔루션으로 이동합니다.

getIndexes()를 사용하여 MongoDB의 특정 컬렉션에서 인덱스 표시

예제 코드:

// 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 셸 지원을 얻으려면 아래에 제공된 명령 중 하나를 사용할 수도 있습니다.

// 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 셸)에 인쇄합니다.

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를 사용하여 볼 수 있습니다.

여기에서 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 시작 현재, 숨겨진 인덱스 옵션은 값이 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 type index를 대상으로 한다는 차이점을 제외하고 이전 예제와 유사합니다.

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