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

MongoDB에서 두 개의 필드를 조합하여 고유하게 유지하는 방법

MongoDB 복합 유니크 인덱스로 두 필드의 고유성 보장하기

MongoDB에서 두 개의 필드(컬럼) 조합이 항상 고유한 값을 갖도록 하려면 unique 옵션을 true로 설정한 복합 인덱스(compound index)를 생성하면 됩니다. 이렇게 하면 두 필드의 값 조합이 동일한 문서가 데이터베이스에 저장되는 것을 방지할 수 있습니다.

인덱스를 생성하면서 두 컬럼을 고유하게 설정하는 방법을 살펴보겠습니다.

> db.keepTwoColumnsUniqueDemo.createIndex({"StudentFirstName":1,"StudentLastName":1},{unique:true});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

위 명령은 StudentFirstNameStudentLastName 두 필드에 대한 복합 유니크 인덱스를 생성합니다. 컬렉션이 존재하지 않았기 때문에 자동으로 생성되었으며, 인덱스 수가 1개에서 2개로 증가한 것을 확인할 수 있습니다.

문서 삽입 테스트

이제 위에서 생성한 컬렉션에 문서를 삽입해 보겠습니다.

> db.keepTwoColumnsUniqueDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith","StudentAge":21});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd30fd7b64f4b851c3a13e5")
}
> db.keepTwoColumnsUniqueDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Doe","StudentAge":23});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd30fe5b64f4b851c3a13e6")
}

첫 번째 문서는 "John Smith", 두 번째 문서는 "John Doe"로 이름은 같지만 성이 다르기 때문에 정상적으로 삽입됩니다. 그러나 세 번째 문서로 이미 존재하는 "John Smith" 조합을 다시 삽입하려고 하면 어떻게 될까요?

> db.keepTwoColumnsUniqueDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith","StudentAge":24});
2019-05-08T22:50:42.803+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: sample.keepTwoColumnsUniqueDemo index: StudentFirstName_1_StudentLastName_1 dup key: { : "John", : "Smith" } :
WriteError({
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: sample.keepTwoColumnsUniqueDemo index: StudentFirstName_1_StudentLastName_1 dup key: { : \"John\", : \"Smith\" }",
"op" : {
"_id" : ObjectId("5cd30feab64f4b851c3a13e7"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith",
"StudentAge" : 24
}
})
WriteError@src/mongo/shell/bulk_api.js:461:48
Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:841:49
Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1

위와 같이 두 필드를 고유하게 설정했기 때문에 중복된 값 조합을 삽입하려는 시도에서 다음과 같은 오류가 발생합니다.

duplicate key error collection

오류 코드 E11000은 MongoDB에서 중복 키 오류를 나타내며, StudentFirstName_1_StudentLastName_1 인덱스에서 "{ John, Smith }"라는 중복 키가 감지되었음을 의미합니다. 나이(StudentAge)가 다르더라도 두 필드의 조합이 동일하기 때문에 삽입이 거부됩니다.

저장된 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회하는 쿼리는 다음과 같습니다.

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

위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{
    "_id" : ObjectId("5cd30fd7b64f4b851c3a13e5"),
    "StudentFirstName" : "John",
    "StudentLastName" : "Smith",
    "StudentAge" : 21
}
{
    "_id" : ObjectId("5cd30fe5b64f4b851c3a13e6"),
    "StudentFirstName" : "John",
    "StudentLastName" : "Doe",
    "StudentAge" : 23
}

결과를 보면 중복으로 삽입을 시도했던 "John Smith" 문서는 저장되지 않고, 처음 삽입한 두 개의 문서만 남아 있는 것을 확인할 수 있습니다.

정리

MongoDB에서 여러 필드의 조합에 대한 고유성을 보장하려면 createIndex() 메서드에 해당 필드들을 객체로 전달하고, 옵션에 {unique:true}를 지정하면 됩니다. 이 복합 유니크 인덱스는 개별 필드가 아니라 필드 값의 조합 전체를 기준으로 고유성을 검사한다는 점이 핵심입니다. 따라서 한 필드의 값이 같아도 다른 필드의 값이 다르면 정상적으로 저장되며, 모든 필드의 조합이 완전히 동일한 경우에만 중복 키 오류(E11000)가 발생합니다.