MongoDB — The Judgement Behind Document Databases
MongoDB — Embedding and Execution Plans
한국어 원문으로 표시합니다.
목표
파드 안에서 도는 진짜 MongoDB 8.0 위에서 문서를 넣고, 찾고, 인덱스를 걸고, 집계하고, 스키마를 걸고, 끼워 넣기를 해 봅니다. 마지막에는 실행 계획을 읽어 숫자로 적습니다.
접속
mongosh labdb
labdb 를 씁니다. PostgreSQL 도 같은 파드에서 돌고 있으니 psql 도 그대로
됩니다 — 두 데이터베이스를 나란히 두고 같은 문제를 각각 풀어 보면 차이가
훨씬 선명해집니다.
결과 파일
몇 단계는 결과를 파일로 남깁니다. mkdir -p /root/work/mongo 를 먼저 하세요.
셸에서 JSON 을 저장할 때는 이렇게 씁니다.
mongosh --quiet labdb --eval 'JSON.stringify(db.items.find({},{_id:0}).toArray())' > /root/work/mongo/02-query.json
문서를 넣는다 — 값이 배열일 수도 있다
mongosh labdb 로 붙습니다. db.items.insertMany([...]) 로 5건 이상 넣으세요. 각 문서에 name(문자열), qty(숫자), tags(배열)를 두세요. 하나는 이름이 빨간 배낭 이어야 합니다.
items 에 5건 이상 · 각 문서에 name·qty·tags(배열)
필요한 필드만 가져온다
qty 가 0보다 큰 문서를 찾고 name 과 qty 만 투영하세요(_id: 0). 결과를 /root/work/mongo/02-query.json 에 JSON 배열로 저장합니다. mongosh --quiet --eval 과 JSON.stringify 를 쓰면 편합니다.
02-query.json 에 qty>0 인 문서가 name·qty 만 담겨 있음
인덱스를 만들고 계획이 바뀌는지 본다
db.items.createIndex({name: 1}). 그다음 db.items.find({name:'빨간 배낭'}).explain() 으로 계획에 IXSCAN 이 나오는지 확인하세요.
name 인덱스가 있고 그 조회가 IXSCAN 을 탑니다
한 필드만 바꾼다
빨간 배낭 의 qty 를 10 으로 바꾸세요. $set 을 쓰세요 — 문서를 통째로 대입하면 적지 않은 필드가 사라집니다.
qty 는 10 이고 name·tags 는 그대로 남아 있음
배열을 펼쳐 태그별로 묶는다
$unwind 로 tags 를 펼치고 $group 으로 태그별 qty 합계를 구하세요. 결과를 /root/work/mongo/05-bytag.json 에 [{_id, total}, ...] 로 저장합니다.
05-bytag.json 의 태그별 합계가 실제 값과 일치
문서 DB 에도 스키마를 건다
db.createCollection('orders', {validator: {$jsonSchema: {...}}}) 로 qty 를 필수·숫자로 정하세요. 규칙을 적어 두고 실제로 막히지 않으면 없는 것과 같습니다 — 문자열을 넣어 거부되는지 직접 해 보세요.
orders 에 $jsonSchema 검증이 있고 잘못된 타입이 실제로 거부됨
함께 읽히는 것은 끼워 넣는다
orders 에 주문 한 건을 넣되 품목을 lines 배열로 끼워 넣으세요(2건 이상, 각 항목에 name·qty). 6단계의 검증을 통과하도록 qty 도 함께 두세요. db.orders.find({'lines.name': ...}) 로 배열 안을 찾을 수 있습니다.
주문 문서 하나에 lines 2건 이상 · lines.name 으로 조회됨
계획을 읽고 숫자로 적는다
/root/work/mongo/08-explain.txt 에 인덱스가 있을 때(IXSCAN)와 없을 때(COLLSCAN)를 비교해 적으세요. explain('executionStats') 의 totalDocsExamined 같은 숫자를 반드시 포함하세요.
08-explain.txt 에 IXSCAN·COLLSCAN 과 숫자가 함께 적혀 있음