MongoDB에서 고유(Unique) 필드 만들기
MongoDB에서 특정 필드에 중복된 값이 저장되지 않도록 하려면 createIndex() 메서드에 unique: true 옵션을 지정하여 고유 인덱스(unique index)를 생성하면 됩니다. 이렇게 하면 해당 필드에는 항상 고유한 값만 저장할 수 있으며, 중복된 값을 삽입하려고 하면 에러가 발생합니다.
1. 고유 인덱스 생성하기
먼저 컬렉션을 자동으로 생성하면서 EmployeeName 필드에 고유 인덱스를 만들어 보겠습니다.
> db.demo82.createIndex({"EmployeeName":1},{unique:true});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}인덱스가 정상적으로 생성되면 위와 같이 numIndexesAfter 값이 증가하고 ok : 1이 반환됩니다.
2. 문서 삽입 및 중복 값 테스트
이제 insertOne() 메서드로 문서를 삽입해 보겠습니다. 처음 두 개의 문서는 서로 다른 이름을 가지므로 정상적으로 저장됩니다.
> db.demo82.insertOne({"EmployeeName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2bfb1b71bf0181ecc422a0")
}
> db.demo82.insertOne({"EmployeeName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2bfb1f71bf0181ecc422a1")
}하지만 이미 존재하는 값인 "Chris"를 다시 삽입하면 어떻게 될까요?
> db.demo82.insertOne({"EmployeeName":"Chris"});
2020-01-25T13:54:00.410+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: test.demo82 index: EmployeeName_1 dup key: { : "Chris" } :
WriteError({
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.demo82 index: EmployeeName_1 dup key: { : \"Chris\" }",
"op" : {
"_id" : ObjectId("5e2bfb2071bf0181ecc422a2"),
"EmployeeName" : "Chris"
}
})위와 같이 E11000 duplicate key error(중복 키 오류)가 발생하며 삽입이 거부됩니다. 이것이 바로 고유 인덱스가 동작하는 모습입니다. 오류 코드 11000은 MongoDB에서 중복 키 충돌을 나타내는 대표적인 코드이므로, 애플리케이션 개발 시 이 코드를 처리하는 로직을 함께 구현하는 것이 좋습니다.
3. 결과 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo82.find();
앞서 unique: true 옵션을 설정했기 때문에 중복된 값은 삽입되지 않았으며, 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e2bfb1b71bf0181ecc422a0"), "EmployeeName" : "Chris" }
{ "_id" : ObjectId("5e2bfb1f71bf0181ecc422a1"), "EmployeeName" : "David" }정리
MongoDB에서 고유한 필드를 만드는 방법은 매우 간단합니다. db.컬렉션명.createIndex({필드명: 1}, {unique: true}) 형태로 고유 인덱스를 생성하기만 하면 됩니다. 이후 해당 필드에 중복된 값이 삽입되면 MongoDB가 자동으로 이를 차단하므로, 데이터 무결성을 유지하는 데 매우 유용합니다.