Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 인덱스 생성하기 – ensureIndex() 메서드 활용법과 고유(Unique) 인덱스 예제

MongoDB 인덱스란 무엇인가?

MongoDB에서 인덱스(Index)는 데이터 조회 속도를 크게 향상시키는 핵심 기능입니다. 인덱스가 없으면 MongoDB는 컬렉션의 모든 문서를 하나씩 스캔해야 하지만, 인덱스를 사용하면 특정 필드를 기준으로 빠르게 문서를 찾을 수 있습니다.

MongoDB에서 인덱스를 생성하려면 ensureIndex() 메서드를 사용합니다. 참고로 최신 버전의 MongoDB에서는 ensureIndex()가 deprecated(사용 중단 권고) 상태이므로, 동일한 역할을 하는 createIndex() 사용이 권장됩니다.

1단계: 테스트용 컬렉션 생성

먼저 다음 쿼리로 컬렉션을 생성합니다.

> db.createCollection("creatingUniqueIndexDemo");
{ "ok" : 1 }

컬렉션이 정상적으로 생성되면 { "ok" : 1 } 응답이 반환됩니다.

2단계: 고유(Unique) 인덱스 생성

이제 위에서 만든 컬렉션에 UserCountryName 필드를 기준으로 고유 인덱스를 생성합니다. unique: true 옵션을 지정하면 해당 필드에 중복된 값이 저장되는 것을 방지할 수 있습니다.

> db.creatingUniqueIndexDemo.ensureIndex({"UserCountryName":1},{unique:true});
{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

결과를 보면 인덱스 수가 1개(_id 기본 인덱스)에서 2개로 증가한 것을 확인할 수 있습니다.

3단계: 문서 삽입 및 중복 오류 확인

생성된 컬렉션에 문서를 삽입해 보겠습니다.

> db.creatingUniqueIndexDemo.insertOne({"UserName":"John","UserAge":21,"UserCountryName":"US"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9947bd330fd0aa0d2fe4d8")
}
> db.creatingUniqueIndexDemo.insertOne({"UserName":"Mike","UserAge":23,"UserCountryName":"UK"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9947c9330fd0aa0d2fe4d9")
}

John(US)과 Mike(UK)는 서로 다른 국가 코드를 가지고 있어 정상적으로 삽입되었습니다. 그런데 이번에는 이미 존재하는 US 값을 가진 문서를 삽입해 보겠습니다.

> db.creatingUniqueIndexDemo.insertOne({"UserName":"Robert","UserAge":26,"UserCountryName":"US"});
2019-03-26T02:57:52.670+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: test.creatingUniqueIndexDemo index: UserCountryName_1 dup key: { : "US" } :

E11000 duplicate key error 오류가 발생했습니다. 이는 고유 인덱스가 설정된 UserCountryName 필드에 이미 존재하는 값 US를 중복해서 삽입하려 했기 때문입니다. 이처럼 unique 인덱스는 데이터 무결성을 보장하는 강력한 도구입니다.

이번에는 다른 국가 코드를 사용해 다시 삽입해 보겠습니다.

> db.creatingUniqueIndexDemo.insertOne({"UserName":"Robert","UserAge":26,"UserCountryName":"AUS"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9947e3330fd0aa0d2fe4db")
}

중복되지 않는 값이므로 정상적으로 삽입됩니다.

4단계: find()로 전체 문서 조회

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

> db.creatingUniqueIndexDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5c9947bd330fd0aa0d2fe4d8"),
   "UserName" : "John",
   "UserAge" : 21,
   "UserCountryName" : "US"
}
{
   "_id" : ObjectId("5c9947c9330fd0aa0d2fe4d9"),
   "UserName" : "Mike",
   "UserAge" : 23,
   "UserCountryName" : "UK"
}
{
   "_id" : ObjectId("5c9947e3330fd0aa0d2fe4db"),
   "UserName" : "Robert",
   "UserAge" : 26,
   "UserCountryName" : "AUS"
}

정리

MongoDB에서 인덱스 생성 절차를 요약하면 다음과 같습니다.

createCollection()으로 컬렉션 생성 → ② ensureIndex()(또는 최신 버전의 createIndex())에 unique: true 옵션을 지정해 고유 인덱스 생성 → ③ 중복 값 삽입 시 E11000 오류 발생 여부로 인덱스 동작 검증 → ④ find()로 결과 확인.

고유 인덱스를 활용하면 애플리케이션 레벨의 별도 검증 로직 없이도 데이터베이스 차원에서 중복 데이터를 효과적으로 방지할 수 있습니다.