Database/MongoDB 실습

[MongoDB] 유니크 인덱스 생성 방법

꽁담 2024. 8. 12. 18:09

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. 유니크 인덱스 생성

인덱스 생성 시 unique 옵션을 true 로 지정한다.

Number 필드를 Unique 인덱스로 생성했다.

[direct: mongos] indexDB> db.uniqueIndex.createIndex( { "Number" : 1 }, { unique: true } )
Number_1

 

 

4. 유니크 인덱스 적재

4-1. 단일 필드 인덱스 테스트

도큐먼트 적재 시 인덱스의 필드를 지정하지 않더라도 NULL 값으로 지정된다.

[direct: mongos] indexDB> db.uniqueIndex.insert( { "Name" : "Hong" } )
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('66b9cf8d23b56ce2101b157d') }
}


[direct: mongos] indexDB> db.uniqueIndex.insert( { "Name" : "Park" } )
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: indexDB.uniqueIndex index: Number_1 dup key: { Number: null }
Result: BulkWriteResult {
  insertedCount: 0,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {}
}
Write Errors: [
  WriteError {
    err: {
      index: 0,
      code: 11000,
      errmsg: 'E11000 duplicate key error collection: indexDB.uniqueIndex index: Number_1 dup key: { Number: null }',
      errInfo: undefined,
      op: { Name: 'Park', _id: ObjectId('66b9cf9c23b56ce2101b157e') }
    }
  }
]


[direct: mongos] indexDB> db.uniqueIndex.insert( { "Name" : "Park" , Number : null } )
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: indexDB.uniqueIndex index: Number_1 dup key: { Number: null }
Result: BulkWriteResult {
  insertedCount: 0,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {}
}
Write Errors: [
  WriteError {
    err: {
      index: 0,
      code: 11000,
      errmsg: 'E11000 duplicate key error collection: indexDB.uniqueIndex index: Number_1 dup key: { Number: null }',
      errInfo: undefined,
      op: {
        Name: 'Park',
        Number: null,
        _id: ObjectId('66b9cfaf23b56ce2101b157f')
      }
    }
  }
]

 

4-2. 서브 도큐먼트 배열 유니크

서브 도큐먼트 배열의 유니크는 중복된 값을 체크하지 않는다.

[direct: mongos] indexDB> db.subuniqueIndex.createIndex( { "Number.ASC" : 1 } , { unique : true } )
Number.ASC_1

[direct: mongos] indexDB> db.subuniqueIndex.insert( { "Name" : "Park", 
                                                      "Number" : [ { "ASC" : 1 } , { "ASC" : 1 } ] } )
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('66b9d10a23b56ce2101b1580') }
}