문서 모델·CRUD (Document & CRUD)¶
개요¶
MongoDB가 데이터를 담는 가장 기본 단위는 문서(document)예요. MongoDB는 데이터 레코드를 BSON 문서로 저장하는데, BSON은 JSON 문서의 2진(binary) 표현이면서 JSON보다 더 많은 데이터 타입을 담을 수 있죠. 관계형 DB의 '행'을 떠올리면 되는데, 결정적 차이는 문서가 필드를 미리 정해 두지 않아도 되는 자유로운 구조라는 점이에요.
표로 치면 컬렉션(collection)이 테이블, 문서가 행인데, 문서 안에는 객체·배열이 그대로 중첩될 수 있어요. 그래서 관계형이라면 여러 테이블로 쪼개 조인해야 할 구조를 하나의 문서 안에 통째로 담을 수 있어요. 단일 문서 크기는 최대 16MB로 제한됩니다.
핵심 개념¶
문서의 구조¶
문서의 필드 값은 어떤 BSON 타입이든 될 수 있어요. 다른 문서(중첩 문서), 배열, 문서의 배열까지 가능하죠. 예를 들어 name 필드에 first와 last라는 필드를 가진 중첩 문서를 넣고, contribs에는 문자열 배열을 담는 식이에요. 문서가 중첩을 허용하니 콘텐츠의 계층 구조를 그대로 표현할 수 있어요.
_id 필드¶
모든 문서에는 기본적으로 _id 필드가 있어요. 컬렉션 안에서 문서의 유일성을 보장하는 기본 키 역할을 하죠. 직접 지정하지 않으면 MongoDB가 ObjectId 값을 자동으로 만들어 넣어요. 다만 _id에 BSON 정규 표현식 타입 값을 넣으면 복제(replication)가 제대로 동작하지 않으니 피해야 해요.
점 표기법 (Dot Notation)¶
중첩 문서의 필드나 배열의 요소에 접근할 때 쓰는 표기법이에요.
- 배열 요소:
"<배열이름>.<인덱스>"— 예를 들어contribs.2 - 중첩 문서의 필드:
"<문서필드>.<하위필드>"— 예를 들어name.first
쿼리나 업데이트에서 이 점 표기법으로 문서 안 깊은 곳의 값을 지정해요.
CRUD 요약¶
문서를 다루는 기본 명령은 다음과 같아요.
- 읽기 —
find()로 조건에 맞는 문서를 조회해요. - 쓰기 —
insertOne()/insertMany()로 새 문서를 넣어요. - 갱신 —
updateOne()/updateMany()가 조건에 맞는 문서의 필드를 바꿔요. - 삭제 —
deleteOne()/deleteMany()로 문서를 지워요.
실제 적용 (데이터스케쳐스)¶
문서 모델이 우리에게 맞는 이유는 형태가 수시로 바뀌는 콘텐츠를 다루기 때문이에요.
- 노트·문서 콘텐츠 — 사용자가 만든 노트는 필드가 계속 늘어나요. 문서형으로 두면 새 필드가 추가돼도 저장 구조(스키마)를 바꿀 필요가 없어요.
- 캔버스 노드 — 캔버스는 요소가 중첩된 구조예요. 문서 하나에 통째로 담으면 관계형처럼 여러 테이블을 조인하지 않아도 돼요.
_id활용 — 문서마다 자동으로 붙는_id로 콘텐츠를 유일하게 식별하고, 중첩 필드에는 점 표기법으로 접근해요.
주의할 점은, 문서형은 구조를 강제하지 않는 만큼 무결성 보장이 약하다는 거예요. 사용자·구독처럼 정합성이 중요한 데이터는 PostgreSQL로, 자유로운 형태의 콘텐츠는 MongoDB로 두는 역할 분담이 자연스러워요.
더 알아보기¶
- 공식 문서 (1차)
- 문서 (Documents) — mongodb.com/docs/manual/core/document
- BSON 타입 — mongodb.com/docs/manual/reference/bson-types
- CRUD 연산 — mongodb.com/docs/manual/crud
- 데이터 모델링 — mongodb.com/docs/manual/core/data-modeling-introduction
- 큐레이션/블로그 (2차)
- MongoDB 공식 블로그 — mongodb.com/blog