/엔지니어/데이터베이스/MongoDB 기초 실전 — CRUD · 인덱스 ·
데이터베이스초급UbuntuDebianCentOSmongodbnosqlcrud

MongoDB 기초 실전 — CRUD · 인덱스 · 집계 파이프라인

MongoDB 설치부터 컬렉션 CRUD, 인덱스 생성, 집계 파이프라인($match/$group/$lookup), mongodump 백업까지 실무 패턴을 정리합니다.

설치 (Ubuntu 22.04)

Bash
# GPG 키 추가
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \
  https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

sudo apt update && sudo apt install -y mongodb-org
sudo systemctl enable --now mongod

# mongosh 접속
mongosh

데이터베이스 · 컬렉션 기본

JavaScript
// DB 선택 (없으면 자동 생성)
use mydb

// 컬렉션 목록
show collections

// 컬렉션 생성 (삽입 시 자동 생성)
db.createCollection("users")

CRUD 기본

JavaScript
// ── Create ──────────────────────────────────────
db.users.insertOne({
  name: "Alice",
  email: "[email protected]",
  age: 30,
  tags: ["admin", "active"],
  createdAt: new Date()
})

db.users.insertMany([
  { name: "Bob", email: "[email protected]", age: 25 },
  { name: "Carol", email: "[email protected]", age: 35 }
])

// ── Read ────────────────────────────────────────
db.users.find()                         // 전체
db.users.find({ age: { $gt: 25 } })    // 조건
db.users.findOne({ email: "[email protected]" })

// 프로젝션 (필드 선택)
db.users.find({}, { name: 1, email: 1, _id: 0 })

// 정렬·제한·건너뜀
db.users.find().sort({ age: -1 }).limit(10).skip(20)

// ── Update ──────────────────────────────────────
db.users.updateOne(
  { email: "[email protected]" },
  { $set: { age: 31 }, $push: { tags: "editor" } }
)

db.users.updateMany(
  { age: { $lt: 18 } },
  { $set: { status: "minor" } }
)

// upsert (없으면 삽입)
db.users.updateOne(
  { email: "[email protected]" },
  { $set: { name: "Dave" } },
  { upsert: true }
)

// ── Delete ──────────────────────────────────────
db.users.deleteOne({ email: "[email protected]" })
db.users.deleteMany({ status: "inactive" })

쿼리 연산자

JavaScript
// 비교
{ age: { $gt: 25, $lte: 40 } }    // 25 초과 40 이하
{ status: { $in: ["active", "pending"] } }
{ status: { $nin: ["banned"] } }

// 논리
{ $and: [{ age: { $gt: 20 } }, { age: { $lt: 40 } }] }
{ $or: [{ name: "Alice" }, { name: "Bob" }] }

// 배열
{ tags: "admin" }                  // 배열에 값 포함
{ tags: { $all: ["admin", "active"] } }

// 정규식
{ name: { $regex: /^Al/i } }

인덱스

JavaScript
// 단일 인덱스
db.users.createIndex({ email: 1 }, { unique: true })

// 복합 인덱스
db.users.createIndex({ age: -1, name: 1 })

// TTL 인덱스 (30일 후 자동 삭제)
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 2592000 })

// 인덱스 목록
db.users.getIndexes()

// 쿼리 실행 계획
db.users.find({ email: "[email protected]" }).explain("executionStats")

집계 파이프라인

JavaScript
// 나이별 평균 계산
db.users.aggregate([
  { $match: { status: "active" } },         // 필터
  { $group: {
    _id: "$department",
    avgAge: { $avg: "$age" },
    count: { $sum: 1 }
  }},
  { $sort: { count: -1 } },
  { $limit: 5 }
])

// $lookup — 컬렉션 조인
db.orders.aggregate([
  { $lookup: {
    from: "users",
    localField: "userId",
    foreignField: "_id",
    as: "user"
  }},
  { $unwind: "$user" },
  { $project: { orderId: 1, "user.name": 1, total: 1 } }
])

백업 · 복원

Bash
# 전체 백업
mongodump --out /backup/$(date +%Y%m%d)

# 특정 DB 백업
mongodump --db mydb --out /backup/

# 복원
mongorestore /backup/20250527/

# 특정 컬렉션만
mongodump --db mydb --collection users --out /backup/
mongorestore --db mydb --collection users /backup/mydb/users.bson
#mongodb#nosql#crud#인덱스#집계#aggregation
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서MongoDB 공식 매뉴얼

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.