Database/MongoDB 실습

[MongoDB] 컬렉션에 인덱스 생성, 삭제, 조회 방법

꽁담 2024. 7. 30. 13:47

 

1. MongoDB 인덱스

쿼리를 효율적으로 사용하기 위해 MongoDB 는 인덱스를 제공한다.

MongoDB 에서 인덱스 유형은 매우 다양하다.

1-1. MongoDB 인덱스 유형

유형 설명
단일 필드 인덱스 특정 필드에 대한 인덱스
복합 인덱스 여러 필드를 조합한 인덱스
해시 인덱스 해시된 값으로 인덱스
텍스트 인덱스 텍스트 검색을 위한 인덱스
2dsphere 인덱스 지리공간 데이터에 대한 인덱스
유일 인덱스 유일한 값만 허용
- 로컬서버 기준에 한정, 샤드서버로 데이터가 분산되는 경우에는 어플리케이션에서 처리

 

 

2. MongoDB 테스트 버전

유형 버전 구성
mongosh 2.2.10  
mongodb 7.0.12 Config : 1개, 포트 20000
Route : 1개, 포트 20001
Shard1 : 1개, 포트 30001
Shard2 : 1개, 포트 40001

 

 

3. 인덱스 생성

3-1. 인덱스 생성

[direct: mongos] test> use indexDB
switched to db indexDB

# 싱글 인덱스
[direct: mongos] indexDB> db.singleCollection.createIndex( { name : 1 } )
name_1

# 복합 인덱스
[direct: mongos] indexDB> db.compositeCollection.createIndex( { name : 1, address : 1 } )
name_1_address_1

# 해시 인덱스
[direct: mongos] indexDB> db.hashCollection.createIndex( { number : "hashed" } )
number_hashed

# 유니크 인덱스
[direct: mongos] indexDB> db.uniqueCollection.createIndex( { identity : 1 }, { unique : true } )
identity_1

 

3-2. 백그라운드 생성

인덱스를 생성할 때는 잠금이 발생한다.

이러면 쿼리는 도큐먼트에 접근할 수 없기때문에 백그라운드로 수행하는 옵션을 사용한다.

[direct: mongos] indexDB> db.backCollection.createIndex( { grade : 1 }, { background: true } )
grade_1

 

3-3. 인덱스 명칭 지정

인덱스에 명칭을 지정하지 않으면 필드명 + 자동증가값이 사용된다.

인덱스에 명칭을 지정하면 지정한 명칭으로 생성된다.

[direct: mongos] indexDB> db.singleCollection.createIndex ( { address : 1 }, { name: "singleCollection_index_address" } )
singleCollection_index_address

[direct: mongos] indexDB> db.singleCollection.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { address: 1 }, name: 'singleCollection_index_address' }
]

 

3-4. 서브필드의 인덱스 생성

도큐먼트 필드는 서브필드를 가질 수 있는데 서브필드에 대해서도 인덱스를 생성할 수 있다.

참고로 서브필드를 가지는 필드에 인덱스를 생성하는 것과, 서브필드에 인덱스를 생성하는 것은 서로 다른 정렬로 동작한다.

[direct: mongos] indexDB> db.subfieldCollection.insert ( 
  { parentField : { childField1 : 123 , childField2 : "test" } 
    , parentField2 : "2024-07-30" } 
)
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('66a86f9cff05830fb31b157d') }
}

# 서브필드에 인덱스 생성
[direct: mongos] indexDB> db.subfieldCollection.createIndex ( { "parentField1.childField1" : 1, "parentField1.childField2" : 1 } )
parentField1.childField1_1_parentField1.childField2_1

# 부모필드에 인덱스 생성
[direct: mongos] indexDB> db.subfieldCollection.createIndex ( { "parentField1" : 1} )
parentField1_1

 

 

4. 인덱스 확인

현재 컬렉션에 인덱스를 확인하려면 getIndexes 를 사용한다.

_id 는 문서의 고유값을 식별하는 MongoDB 내부값으로 인덱스가 기본으로 생성된다.

[direct: mongos] indexDB> db.singleCollection.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { name: 1 }, name: 'name_1' }
]

[direct: mongos] indexDB> db.hashCollection.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { number: 'hashed' }, name: 'number_hashed' }
]

 

 

5. 인덱스 삭제

dropIndex 를 사용하여 인덱스를 삭제한다.

dropIndex ( ) 의 안에는 인덱스 이름을 넣어주면 된다.

[direct: mongos] indexDB> db.singleCollection.dropIndex("name_1")
{
  raw: { 'rs1/127.0.0.1:30001': { nIndexesWas: 2, ok: 1 } },
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1722314426, i: 1 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1722314426, i: 1 })
}

[direct: mongos] indexDB> db.singleCollection.getIndexes()
[ { v: 2, key: { _id: 1 }, name: '_id_' } ]