[MongoDB] 02. CRUD 기본 (문서 삽입, 조회, 수정, 삭제)
MongoDB에서의 문서 CRUD(Create, Read, Update, Delete) 명령어를 정리합니다.
데이터베이스와 컬렉션
데이터베이스 관리
// 데이터베이스 목록
show dbs
// 데이터베이스 전환 (없으면 첫 문서 삽입 시 자동 생성)
use mydb
// 현재 데이터베이스 확인
db
// 데이터베이스 삭제
db.dropDatabase()
컬렉션 관리
// 컬렉션 목록
show collections
// 컬렉션 생성 (명시적, 보통 자동 생성)
db.createCollection("users")
// 옵션과 함께 생성
db.createCollection("logs", {
capped: true, // 고정 크기 컬렉션
size: 104857600, // 100MB
max: 100000 // 최대 문서 수
})
// 컬렉션 삭제
db.users.drop()
INSERT (문서 삽입)
단일 문서 삽입
db.users.insertOne({
name: "홍길동",
age: 30,
email: "hong@test.com",
dept: "개발팀",
salary: 5000000,
hire_date: new Date("2024-01-15"),
skills: ["JavaScript", "Python", "MongoDB"],
address: { city: "서울", district: "강남구" }
})
// { acknowledged: true, insertedId: ObjectId("...") }
다중 문서 삽입
db.users.insertMany([
{ name: "김철수", age: 25, dept: "기획팀", salary: 4500000 },
{ name: "이영희", age: 28, dept: "개발팀", salary: 5500000 },
{ name: "박민수", age: 35, dept: "디자인팀", salary: 4800000 },
{ name: "최지은", age: 32, dept: "개발팀", salary: 6000000 }
])
_id 직접 지정
db.users.insertOne({
_id: "user_001", // 직접 지정 가능 (중복 불가)
name: "관리자",
role: "admin"
})
FIND (문서 조회)
기본 조회
// 전체 조회
db.users.find()
// 보기 좋게 출력
db.users.find().pretty()
// 조건 조회
db.users.find({ dept: "개발팀" })
// 단일 문서 조회 (첫 번째 매칭)
db.users.findOne({ name: "홍길동" })
비교 연산자
| 연산자 | 설명 | SQL 대응 |
|---|---|---|
$eq |
같음 | = |
$ne |
같지 않음 | != |
$gt |
초과 | > |
$gte |
이상 | >= |
$lt |
미만 | < |
$lte |
이하 | <= |
$in |
목록 포함 | IN |
$nin |
목록 미포함 | NOT IN |
db.users.find({ salary: { $gte: 5000000 } })
db.users.find({ age: { $gt: 25, $lt: 35 } })
db.users.find({ dept: { $in: ["개발팀", "기획팀"] } })
db.users.find({ dept: { $ne: "디자인팀" } })
논리 연산자
// AND (기본)
db.users.find({ dept: "개발팀", salary: { $gte: 5000000 } })
// $and (명시적)
db.users.find({ $and: [{ dept: "개발팀" }, { salary: { $gte: 5000000 } }] })
// $or
db.users.find({ $or: [{ dept: "개발팀" }, { dept: "기획팀" }] })
// $not
db.users.find({ age: { $not: { $gte: 30 } } })
// $nor (모두 아닌)
db.users.find({ $nor: [{ dept: "개발팀" }, { dept: "기획팀" }] })
필드/타입 연산자
// 필드 존재 여부
db.users.find({ email: { $exists: true } })
db.users.find({ phone: { $exists: false } })
// 타입 확인
db.users.find({ age: { $type: "number" } })
// 정규식
db.users.find({ name: { $regex: /^홍/ } })
db.users.find({ email: { $regex: /test\.com$/, $options: "i" } })
배열 쿼리
// 배열에 특정 값 포함
db.users.find({ skills: "Python" })
// 배열 크기
db.users.find({ skills: { $size: 3 } })
// $all: 모든 값 포함
db.users.find({ skills: { $all: ["JavaScript", "Python"] } })
// $elemMatch: 배열 요소 조건
db.users.find({ orders: { $elemMatch: { price: { $gt: 100000 } } } })
중첩 문서 쿼리
// 점 표기법 (Dot Notation)
db.users.find({ "address.city": "서울" })
db.users.find({ "orders.0.product": "노트북" })
프로젝션 (반환 필드 선택)
// 특정 필드만 반환 (1: 포함, 0: 제외)
db.users.find({}, { name: 1, email: 1, _id: 0 })
// 특정 필드 제외
db.users.find({}, { password: 0, __v: 0 })
정렬, 제한, 건너뛰기
// 정렬 (1: 오름차순, -1: 내림차순)
db.users.find().sort({ salary: -1 })
db.users.find().sort({ dept: 1, salary: -1 })
// 제한
db.users.find().limit(5)
// 건너뛰기 (페이징)
db.users.find().skip(10).limit(5)
// 개수
db.users.countDocuments({ dept: "개발팀" })
db.users.estimatedDocumentCount() // 빠른 추정치
UPDATE (문서 수정)
수정 연산자
| 연산자 | 설명 |
|---|---|
$set |
필드 값 설정 (없으면 추가) |
$unset |
필드 삭제 |
$inc |
숫자 증감 |
$mul |
숫자 곱하기 |
$rename |
필드 이름 변경 |
$min / $max |
최소/최대값으로 갱신 |
$push |
배열에 요소 추가 |
$pull |
배열에서 요소 제거 |
$addToSet |
배열에 중복 없이 추가 |
$pop |
배열 첫/마지막 요소 제거 |
$currentDate |
현재 날짜로 설정 |
단일 문서 수정
// $set: 필드 값 변경
db.users.updateOne(
{ name: "홍길동" },
{ $set: { salary: 5500000, dept: "인사팀" } }
)
// $inc: 숫자 증감
db.users.updateOne(
{ name: "홍길동" },
{ $inc: { salary: 500000, age: 1 } }
)
// $unset: 필드 삭제
db.users.updateOne(
{ name: "홍길동" },
{ $unset: { phone: "" } }
)
// $push: 배열에 추가
db.users.updateOne(
{ name: "홍길동" },
{ $push: { skills: "Redis" } }
)
// $addToSet: 중복 없이 배열에 추가
db.users.updateOne(
{ name: "홍길동" },
{ $addToSet: { skills: "Python" } } // 이미 있으면 무시
)
// $pull: 배열에서 제거
db.users.updateOne(
{ name: "홍길동" },
{ $pull: { skills: "Python" } }
)
다중 문서 수정
// 조건에 맞는 모든 문서 수정
db.users.updateMany(
{ dept: "개발팀" },
{ $inc: { salary: 500000 } }
)
Upsert (없으면 삽입, 있으면 수정)
db.users.updateOne(
{ email: "new@test.com" },
{ $set: { name: "신규유저", age: 20 } },
{ upsert: true }
)
replaceOne (문서 전체 교체)
db.users.replaceOne(
{ name: "홍길동" },
{ name: "홍길동", age: 31, dept: "CTO", salary: 8000000 }
)
DELETE (문서 삭제)
// 단일 문서 삭제
db.users.deleteOne({ name: "홍길동" })
// 다중 문서 삭제
db.users.deleteMany({ dept: "기획팀" })
// 전체 삭제
db.users.deleteMany({})
// 컬렉션 자체 삭제 (더 빠름)
db.users.drop()
findOneAndUpdate / findOneAndDelete
수정/삭제와 동시에 해당 문서를 반환합니다.
// 수정 후 새 문서 반환
db.users.findOneAndUpdate(
{ name: "홍길동" },
{ $inc: { salary: 100000 } },
{ returnDocument: "after" } // "before" 또는 "after"
)
// 삭제하면서 삭제된 문서 반환
db.users.findOneAndDelete({ name: "홍길동" })
- [MongoDB] 10. 자주 발생하는 Troubleshooting
- [MongoDB] 09. 성능 튜닝과 모니터링
- [MongoDB] 08. 백업과 복구
- [MongoDB] 07. 보안과 사용자 관리
- [MongoDB] 06. Replica Set과 Sharding (고가용성/확장)
- [MongoDB] 05. 스키마 설계 (Embedding vs Referencing)
- [MongoDB] 04. 인덱스 (Index)
- [MongoDB] 03. Aggregation Pipeline (집계)
- [MongoDB] 02. CRUD 기본 (문서 삽입, 조회, 수정, 삭제)
- [MongoDB] 01. MongoDB 소개 및 설치