관리 메뉴

JIE0025

[MongoDB] _id를 제거할 수 있을까? 본문

백엔드/데이터베이스

[MongoDB] _id를 제거할 수 있을까?

Kangjieun11 2023. 6. 4. 22:48
728x90

 

✅ 개요

몽고디비에선, PK의 역할을 하는 _id를 사용한다.

 

만약 _id를 지정하지 않으면,

자동으로 ObjectId라는 기본 데이터형을 사용해 12bytes로 표현이 되는데

 

RDBMS에서는 PK의 이름을 지정할 수 있었다.

 

MongoDB에서도 _id가 아닌, 특정 컬럼을 PK처럼 사용할 수 있는지 궁금해졌다.

_id를 제거할수는 있는걸까?

 

✅ _id

 

 

https://www.mongodb.com/docs/manual/core/document/

 

Documents — MongoDB Manual

Docs Home → MongoDB Manual MongoDB stores data records as BSON documents. BSON is a binary representation of JSON documents, though it contains more data types than JSON. For the BSON spec, see bsonspec.org. See also BSON Types.MongoDB documents are comp

www.mongodb.com

 

 

공식문서를 확인해보면 _id에 대해 아래와 같이 나와있다.

 

 

 

  • 필드 _id는 기본키로 사용하기 위해 예약되어있다.
  • 해당 값은 컬렉션에서 고유(UNIQUE)해야하며, 변경할 수 없다.
  • 배열 이외의 모든 유형일 수 있다.
  • _id에 하위 필드가 포함된 경우, 필드 이름은 ($)로 시작할 수 없다. 

 

이 내용만 보면 _id가 생성된 이후로, 해당 값은 고유하고 변경할 수 없다는 뜻인것 같고

 

>> _id 필드명을 변경할 수 있다거나, 삭제할 수 있는지의 내용은 보이지 않았다.

너무 당연히 삭제하지 않을거라 생각해서 그런걸까?

 

 

 

1️⃣ Document 삽입 중 필드만 추가 

 

문서를 삽입할때 필드만 추가를 해봤다.

사실 _id가 없으면 default로 ObjectId를 사용한다는것을 위에서 한번 언급했기 때문에 
ObjectId로 설정 될것이 예상되었다.

 

 

 

예상과 일치했다.

_id를 명시하지 않으면 기본 타입인 ObjectId가 자동 생성되는것을 확인할 수 있다.

 

 

2️⃣ Document에서 update명령어를 통해 _id 제거 시도

 

먼저 다른 필드에 UNIQUE를 지정해주고, _id를 제거하도록 시도해봤다.

 

 

 

2개 UNIQUE한 인덱스가 생겼다.

_id는 기본적으로 PK의 역할로서 지정되어있어서 처음부터 생성되어있다.

 

 

 

이제 _id 를 제거해보자

 

 

 

db.collection.update(
  { 'columnName': { '$exists': true } }, // 일치하는 컬럼, 필드를 찾기
  { '$unset': { 'columnName': true } }, // $unset 연산자로 제거하기
  false, // [Option] Upsert 적용 여부 <Boolean>
  true // [Option] 멀티 업데이트(Multi update) 여부 <Boolean>
)

 

 

 

 

음... 명령어를 쳐봤는데 

 

그대로 잘 남아있다. ㅜㅜ

 

 

✅ 결론 :  _id는 삭제할 수 없는것 같다 ....

결론적으로 _id를 삭제하거나 다른 컬럼명으로 대체할 수는 없을것 같다.

 

 

 

 

How to remove _id in MongoDB and replace with another field as a Primary Key?

I'm have a huge documents in a collection. I want to remove auto generated Object Id (_id key) from all the documents and replace it with another field as a Primary key? I don't understand is why is

stackoverflow.com

 

 

공식문서를 다시 읽어봤는데

기본키 역할을 하는 _id 필드가 필요하다

라고 되어있어서.....

 

아무래도 _id를 제거하거나, 다른 컬럼명으로 해당 역할을 대체하는것은 불가능해보인다.

 

 

 

 


references