※ 데이터 조회 (Query, Projection, Cursor)
MongoDB에서 데이터를 조회할 때는 find() 메서드를 사용하며,
조건(Query), 필드 선택(Projection), 커서(Cursor) 등의 개념을 함께 이해하는 것이 중요합니다.
📌 1) 기본 조회 (Query)
// 전체 조회
db.students.find();
// 조건 조회
db.students.find({ major: "AI" });
// 비교 연산자 사용
db.students.find({ age: { $gte: 25 } }); // age >= 25
db.students.find({ age: { $lte: 30, $ne: 27 } }); // age <= 30 AND age != 27
📌 2) Projection – 출력 필드 선택
// name과 age만 조회 (_id 제외)
db.students.find({}, { name: 1, age: 1, _id: 0 });
// 특정 필드 제외
db.students.find({}, { email: 0, phone: 0 });
✅ Projection: 조회 시 특정 필드만 선택하거나 제외하여 불필요한 데이터 전송을 줄이는 기술입니다.
📌 3) Cursor – 반복자(Iterator) 객체
let cursor = db.students.find({ major: "AI" });
// 커서로 반복 처리
while (cursor.hasNext()) {
printjson(cursor.next());
}
✅ Cursor(커서): `find()` 결과는 실제 배열이 아니라 지연(lazy) 평가되는 커서 객체이며, 필요한 만큼 반복(iterate)하여 데이터를 꺼낼 수 있습니다.
※ 도큐먼트 수정 연산자 ($set, $inc, $push 등)
MongoDB는 다양한 수정 연산자(Update Operators)를 제공하여 필드를 효율적으로 변경할 수 있습니다.
📌 1) $set – 필드 값 수정 또는 생성
db.students.updateOne(
{ name: "지우" },
{ $set: { major: "Computer Science", age: 27 } }
);
✅ 존재하는 필드는 수정하고, 없는 필드는 새로 생성합니다.
📌 2) $inc – 숫자 값 증가/감소
db.students.updateOne(
{ name: "지우" },
{ $inc: { age: 1 } } // age +1
);
✅ 카운터, 포인트, 조회수 업데이트 등에 자주 사용됩니다.
📌 3) $push – 배열에 요소 추가
db.students.updateOne(
{ name: "지우" },
{ $push: { skills: "Kubernetes" } }
);
✅ `$push`는 배열 필드에 새 값을 추가하며, `$each`, `$sort`, `$slice`와 함께 사용하면 더 정교한 조작이 가능합니다.
📌 4) $addToSet – 중복 없이 배열 추가
db.students.updateOne(
{ name: "지우" },
{ $addToSet: { skills: "Python" } }
);
✅ 배열 내 중복 방지가 필요할 때 `$push` 대신 `$addToSet`을 사용합니다.
📌 5) $unset – 필드 삭제
db.students.updateOne(
{ name: "지우" },
{ $unset: { phone: "" } }
);
✅ `$unset`을 사용하면 특정 필드를 삭제할 수 있습니다.
※ 도큐먼트 삭제 및 옵션
데이터 삭제는 deleteOne()과 deleteMany()를 통해 수행합니다.
// 단일 도큐먼트 삭제
db.students.deleteOne({ name: "민준" });
// 여러 도큐먼트 삭제
db.students.deleteMany({ major: "AI" });
// 전체 삭제
db.students.deleteMany({});
✅ 삭제 시에는 조건문을 신중하게 작성해야 하며, 실무에서는 보통 Soft Delete(삭제 표시 플래그만 변경) 전략을 사용하기도 합니다.
※ Collection 관리 (Capped Collection, Index 등)
📁 1) Capped Collection – 고정 크기 컬렉션
Capped Collection은 일정 크기를 초과하면 가장 오래된 도큐먼트를 자동 삭제하는 특수 컬렉션입니다.
로그, 모니터링 데이터 저장 등에 사용됩니다.
// 크기 1MB, 최대 1000개의 문서만 저장
db.createCollection("logs", { capped: true, size: 1048576, max: 1000 });
✅ 고정 크기와 자동 순환 저장 기능이 있어, 실시간 로그 저장소로 자주 사용됩니다.
📁 2) Index – 조회 성능 향상
인덱스는 검색 속도를 비약적으로 향상시키는 구조입니다.
find() 조건에 사용되는 필드는 반드시 인덱스를 고려해야 합니다.
// 단일 필드 인덱스 생성
db.students.createIndex({ name: 1 }); // 1: 오름차순
// 복합 인덱스 생성
db.students.createIndex({ major: 1, age: -1 });
// 인덱스 목록 확인
db.students.getIndexes();
// 인덱스 삭제
db.students.dropIndex("name_1");
✅ 인덱스를 과도하게 만들면 쓰기 속도가 느려지고 저장 공간이 증가하므로 조회 패턴에 맞춰 전략적으로 생성해야 합니다.
※ 서버 및 컬렉션 상태 조회
MongoDB는 명령어를 통해 서버, 데이터베이스, 컬렉션 상태를 조회할 수 있습니다.
// 서버 상태 확인
db.serverStatus();
// 데이터베이스 목록
show dbs;
// 현재 데이터베이스 정보
db.stats();
// 컬렉션 정보
db.students.stats();
✅ `db.serverStatus()`는 성능, 커넥션, 메모리 사용량 등을 확인할 수 있어 운영 환경에서 매우 유용합니다.
※ ObjectId란?
MongoDB에서 각 도큐먼트는 기본적으로 _id 필드를 가지며,
여기에 저장되는 값이 ObjectId입니다. 이는 12바이트(24자 hex)의 고유 식별자로,
전 세계에서 충돌 없이 생성될 수 있습니다.
📌 ObjectId 구조 (12 byte):
- 4 byte: 타임스탬프
- 5 byte: 머신 + 프로세스 ID
- 3 byte: 증가 카운터
// ObjectId 생성 및 조회
db.students.insertOne({ name: "지우" });
db.students.find({ _id: ObjectId("6521f45b2a6b3d0012a12345") });
✅ ObjectId는 생성 시간 기반으로 정렬되므로, 시간 순 정렬, 로그 분석 등에 유용합니다.
※ WriteConcern – 쓰기 안정성 보장
Write Concern은 MongoDB가 쓰기 연산을 처리할 때 얼마나 강력한 "확인"을 요구할지를 설정하는 옵션입니다. 즉, 데이터 쓰기의 안정성 vs 성능을 조절하는 장치입니다.
// 쓰기 안정성 설정 예시
db.students.insertOne(
{ name: "민준", major: "AI" },
{ writeConcern: { w: "majority", wtimeout: 5000 } }
);
✅ 고가용성이 필요한 금융·거래 서비스에서는 `majority`, 로그성 데이터는 `w:1` 또는 `w:0`을 사용하는 식으로 조절합니다.
'2025 현대오토에버 모빌리티 SW 스쿨(클라우드 2기) > 데이터베이스' 카테고리의 다른 글
| [Database] Python과 DB 연동 (2) – MariaDB (0) | 2025.10.07 |
|---|---|
| [Database] Python과 DB 연동 (1) – MongoDB (0) | 2025.10.07 |
| [Database] NoSQL과 MongoDB 기본 (0) | 2025.10.07 |
| [Database] DML과 트랜잭션(TCL) (0) | 2025.10.07 |
| [Database] DDL과 제약 조건 (0) | 2025.10.07 |