Database/MongoDB

[몽고DB 완벽 가이드] 2. 몽고DB 기본

noahkim_ 2025. 4. 27. 22:39

크리스티나 초도로 , 섀넌 브래드쇼 , 오언 브라질 님의 "몽고DB 완벽 가이드" 책을 정리한 포스팅 입니다.

 

1. 도큐먼트

  • MongoDB 데이터의 기본 단위
항목 내용
형태
키-값 집합 (Key-Value Pair)
- 키
문자형
- 정렬된 상태로 저장됨
- 대소문자를 구분함
- 중복 불가
- null 포함 불가

특수 문자
- . (점)과 $는 특별한 의미를 가짐
- 값
데이터형과 대소문자를 구분함
자료구조
다양한 프로그래밍 언어의 자료구조와 유사
- 맵, 해시, 딕셔너리, 객체 등

 

2. 컬렉션

  • 도큐먼트의 모음
  • 보통 같은 구조의 도큐먼트를 그룹화
    • 쿼리 속도 향상
    • 효율적인 인덱싱
    • 데이터 지역성 향상

 

특징

항목 내용
동적 스키마
- 하나의 컬렉션 안에 서로 다른 구조의 도큐먼트 존재 가능
네이밍 규칙 - 빈 문자열 불가
- null 문자 불가
- system으로 시작 불가
- $ 사용 불가
서브컬렉션
- 네임스페이스에 .(점)을 사용하여 서브컬렉션 생성 가능 (parent.child 형태)

 

3. 데이터베이스

  • 컬렉션의 모음
  • 독립적
  • Mongo DB의 단일 인스턴스의 호스팅 대상 단위 (여러 데이터베이스 호스팅 가능)
예약어 용도
admin 인증 및 권한 부여 관리
local
서버 정보 저장
- 복제 프로세스 데이터
config
샤딩 관련 메타데이터 저장

 

4. 몽고DB 시작

5. 몽고DB 셸 소개

  • 자바스크립트 해석기

 

예제) 데이터베이스 & 컬렉션 & 도큐먼트

더보기

데이터베이스 선택 (생성)

use db

 

컬렉션 생성

db.createCollection("movies")

 

도큐먼트 추가

db.movies.insertOne({"title":"Red Rocket", "director":"Sean Baker", "year":2021})

db.movies.insertMany([
  {"title":"Anora", "director":"Sean Baker", "year":2024},
  {"title":"The Florida Project", "director":"Sean Baker", "year":2017}
])

 

예제) CRUD

더보기

읽기

db.movies.find() # 전체 읽기
db.movies.find({year:2024}) # 조건
db.movies.find({director:"Sean Baker"})

 

수정

db.movies.updateOne({title:"Anora"}, {$set: {year: 2024}})

db.movies.updateMany(
  { director: "Sean Baker" },
  { $set: { year: 2025 } }
)

 

삭제

db.movies.deleteOne({"title":"Red Rocket"})

db.movies.deleteMany(
  { year: 2024 }
)

 

6. 데이터형

데이터형 설명
null 값 없음
boolean true or false
number 숫자형
- NumberInt: 4 byte (signed)
- NumberLong: 8 byte (signed)
string 문자열
date 날짜
- new Date()로 해야 객체가 생성되어 문자열 표현이 반환됨
array list, stack, queue
set
nested 중첩된 도큐먼트
- 객체 안에 객체
object_id MongoDB 고유 식별자
- value: ObjectId (모든 도큐먼트에 자동으로 부여됨)
- key: _id (12 byte. timestamp + random + counter)
➡️ 여러 장비와 프로세스에 걸쳐 유일성을 보장함 (분산 환경에 최적)
binary 이진 데이터 저장
code 실행 가능한 코드 조각 (JavaScript 등)

 

 

예제) 선언

더보기
db.employee.insertOne({
    "name": "noah kim",
    "age": NumberInt(30),
    "start_date": new Date(),
    "salary": NumberLong(1000000000), 
    "skills": ["mongodb", "javascript"], 
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "zip": "10001"
    },
    "profile_img": BinData(0, "iVBORw0KGgoAAAANSUhEUgAAAAUA..."),
    "script": Code("function greet() { return 'Hello, World!'; }")	
})

 

예제) 조회

더보기

regex

db.employee.find({name: {"$regex": "^noah.*"}})

 

array

db.employee.find({skills: {"$in": ['mongodb']} }) # 부분 포함
db.employee.find({skills: {"$all": ["mongodb", "javascript"]} }) # 모두 포함
db.employee.find({skills: {"$elemMatch": { "$gte": "mongodb", "$lte": "mongodb8" } } }) # 요소 별 조건 검색
db.employee.find({skills: {"$size": 2} }) # 배열 길이 기준 검색
db.employee.find({ name: "noah kim" }, { skills: { "$slice": 1 } }) # 배열의 특정 부분만 추출

 

script 

const { MongoClient } = require('mongodb');

async function run() {
  const client = new MongoClient('mongodb://localhost:27017');
  await client.connect();
  
  const db = client.db('your_database');
  const collection = db.collection('employee');
  
  const employees = await collection.find({ script: { "$exists": true } }).toArray();
  
  employees.forEach(doc => {
    const scriptFunc = new Function("return " + doc.script.code)();  // MongoDB에서 가져온 코드 실행
    console.log(scriptFunc());
  });

  await client.close();
}

run().catch(console.error);
  • 외부 애플리케이션에서 사용하기

 

예제) 수정 & 삭제

더보기

date

db.employee.updateMany(
  { start_date: {$gte: new Date("2025-01-01") } }, # 조건
  { $set: { status: "active" } }  # 갱신
)

 

regex

db.employee.updateMany({ name: { $regex: /kim$/ }  }, { $set: { title: "senior developer" } } )
db.employee.deleteMany({ name: { $regex: /^A.*/ }  } )

 

array

db.employee.updateOne({ name: "noah kim" }, { $push: { skills: "nodejs" } } ) # 요소 추가
db.employee.updateOne({ name: "noah kim" }, { $pull: { skills: "nodejs" } } ) # 요소 제거