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

MongoDB에서 고유 인덱스(unique index)로 배열 필드의 중복 값 방지하기

MongoDB에서 특정 필드, 특히 배열 필드에 중복된 값이 저장되는 것을 방지하려면 ensureIndex() 메서드를 사용해 고유(unique) 인덱스를 생성하고, 옵션 객체 안에 unique: 1을 설정하면 됩니다. 이렇게 하면 동일한 값이 다른 문서의 배열에 이미 존재할 경우 삽입이 거부됩니다.

참고: 최신 MongoDB 버전에서는 ensureIndex()가 더 이상 권장되지 않으며(deprecated), 대신 createIndex()를 사용하는 것이 좋습니다. 두 메서드의 동작 방식은 동일합니다.

1. 컬렉션 생성 및 문서 삽입

먼저 샘플 문서들을 담은 컬렉션을 만들어 보겠습니다.

> db.demo298.save({Name: 'Chris', Marks: [46, 79] });
WriteResult({ "nInserted" : 1 })
> db.demo298.save({Name: 'David', Marks: [67, 88] });
WriteResult({ "nInserted" : 1 })

두 개의 문서가 성공적으로 삽입되었습니다.

2. Marks 필드에 고유 인덱스 생성

이제 Marks 배열 필드에 고유 인덱스를 생성합니다.

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

인덱스가 정상적으로 생성되어 인덱스 개수가 1개에서 2개로 늘어난 것을 확인할 수 있습니다.

3. 중복 값 삽입 시 오류 발생

고유 인덱스가 적용된 상태에서 기존 문서에 이미 존재하는 값(88)을 포함한 새 문서를 삽입해 보겠습니다.

> db.demo298.save({Name: 'Mike', Marks: [88,98] });
WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "E11000 duplicate key error collection: test.demo298 index: Marks_1 dup key: { : 88.0 }"
   }
})

삽입이 실패하며 E11000 duplicate key error(중복 키 오류)가 발생했습니다. David의 문서에 이미 88이라는 값이 존재하기 때문입니다. 이처럼 고유 인덱스는 배열 내부의 개별 요소에도 적용되어 중복 데이터 입력을 자동으로 차단합니다.

4. find()로 전체 문서 조회

find() 메서드를 사용해 컬렉션의 모든 문서를 확인해 보겠습니다.

> db.demo298.find();

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

{ "_id" : ObjectId("5e4d56e55d93261e4bc9ea48"), "Name" : "Chris", "Marks" : [ 46, 79 ] }
{ "_id" : ObjectId("5e4d56f55d93261e4bc9ea49"), "Name" : "David", "Marks" : [ 67, 88 ] }

중복 값으로 인해 거부된 Mike의 문서는 저장되지 않았으며, 처음 삽입한 두 문서만 조회되는 것을 확인할 수 있습니다.