MongoDB의 ObjectId는 시드(seed) 문자열을 입력값으로 받지 않습니다. 따라서 특정 문자열을 기반으로 고유 식별자를 만들고 싶다면, ObjectId를 사용하는 대신 _id 필드에 원하는 문자열 값을 직접 지정해야 합니다.
이번 글에서는 문자열 값을 _id로 사용하여 컬렉션을 생성하고 문서를 삽입하는 방법을 단계별로 살펴보겠습니다.
1. 문자열 _id 값으로 문서 삽입하기
먼저 demo667이라는 컬렉션을 만들고, 문자열 값을 가진 _id를 포함한 문서들을 삽입해 보겠습니다.
> db.demo667.insertOne({_id:"Chris"});
{ "acknowledged" : true, "insertedId" : "Chris" }
> db.demo667.insertOne({_id:"David"});
{ "acknowledged" : true, "insertedId" : "David" }중복 키 오류 발생 사례
_id는 컬렉션 내에서 반드시 고유해야 합니다. 이미 존재하는 값으로 다시 삽입을 시도하면 아래와 같이 E11000 duplicate key error가 발생합니다.
> db.demo667.insertOne({_id:"Chris"});
2020-04-23T22:01:23.268+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: test.demo667 index: _id_ dup key: { : "Chris" } :
WriteError({
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.demo667 index: _id_ dup key: { : \"Chris\" }",
"op" : {
"_id" : "Chris"
}
})이 오류는 해당 문자열 값이 이미 _id_ 인덱스에 존재하기 때문입니다. 이처럼 중복된 _id 삽입 시도는 항상 거부되므로, 애플리케이션 코드에서 이러한 상황을 적절히 처리해 주는 것이 좋습니다.
나머지 서로 다른 문자열 값들은 정상적으로 삽입됩니다.
> db.demo667.insertOne({_id:"Bob"});
{ "acknowledged" : true, "insertedId" : "Bob" }
> db.demo667.insertOne({_id:"Mike"});
{ "acknowledged" : true, "insertedId" : "Mike" }2. find() 메서드로 전체 문서 조회하기
삽입된 모든 문서를 확인하려면 find() 메서드를 사용하면 됩니다.
> db.demo667.find();
위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : "Chris" }
{ "_id" : "David" }
{ "_id" : "Bob" }
{ "_id" : "Mike" }정리
- ObjectId는 시드 문자열을 허용하지 않으므로, 문자열 기반 식별자가 필요하면
_id에 직접 문자열을 지정해야 합니다. _id값은 컬렉션 내에서 유일해야 하며, 중복 시 E11000 오류가 발생합니다.- 자동 생성되는 ObjectId 대신 의미 있는 문자열 ID를 사용하면 데이터 조회 및 관리가 더 직관적일 수 있습니다.