MongoDB 알아보기

몽고DB 완벽가이드(3판) 내용 정리

몽고DB 특징

  • 도큐먼트 지향 데이터베이스
    • 복잡한 계층 관계를 하나의 레코드로 표현 가능
  • 고정된 스키마가 없음(schemaless)
    • 필요에 따라 필드 추가/제거 가능
  • 분삭 확장에 용이
    • 데이터를 여러 서버에 쉽게 분산 가능
  • 다양한 기능 제공
    • DBMS의 대부분 기능 제공
    • 인덱싱: 고유, 복합, 공간 정보, 전문, 계층 구조 보조 인덱스, 부분 인덱스
    • 집계
    • 특수한 컬렉션 유형: 유효 시간 컬렉션
    • 파일 스토리지: 큰 파일과 파일 메타데이터를 저장하는 프로토콜 지원
    • join 지원
  • 고성능
    • 기회적 락을 사용하여 동시성과 처리량 극대화

Document

  • 정렬된 키와 연결된 값의 집합으로 이루어짐
  • 키(UTF-8)
    • \0(null 문자) 미포함
    • .$ 는 예약어로 취급
    • 대소문자 구분
    • 중복 불가
    • 데이터형
    • 내장 도큐먼트 전체
    • 숫자, 문자 구분
// 숫자와 문자를 구분하므로 서로 다른 도큐먼트
{"count" : 5}
{"count" : "5"}

// 대소문자를 구분하므로 서로 다른 도큐먼트
{"count" : 5}
{"Count" : 5}

// 키가 중복될 수 없으므로 올바른 도큐먼트가 아님
{"greeting": "Hi", "greeting" : "Hello"}

Collection

  • 도큐먼트의 모음
  • RDB의 테이블에 대응
  • 동적 스키마
    • 하나의 컬렉션 내 도큐먼트들이 모두 다른 구조 가능
  • 컬렉션의 필요성
    • 같은 컬렉션에 다른 종류의 도큐먼트를 저장하면 쿼리의 결과값 예상이나 데이터 관리가 번거로울 수 있음
    • 컬렉션별로 목록을 뽑으면 빠름
    • 같은 종류의 데이터를 하나의 컬렉션에 모으면 데이터 지역성에 좋음
    • 같은 유형의 도큐먼트를 하나의 컬렉션에 넣어 효율적 인덱싱 가능
  • 도큐먼트 유효성 검사, 객체-도큐먼트 매핑 라이브러리 이용 가능
  • 이름으로 식별(UTF-8)
    • 빈 문자열(“”) 유효하지 않음
    • \0(null 문자) 불가
    • system. 으로 시작하는 컬렉션명은 예약어이므로 사용 불가
    • 사용자가 만든 컬렉션은 $ 포함 불가
  • 서브클렉션
    • 네임스페이스에 . 문자 사용
    • 컬렉션 체계화 방법
    • blog 컬렉션이 없어도 blog.posts, blog.authors 컬렉션 가능하며 자식 컬렉션과의 연관 관계도 없음

Database

  • 데이터베이스에 컬렉션 그룹화 가능
  • 단일 인스턴스가 여러 데이터베이스 호스팅 가능
  • 이름으로 식별(UTF-8)
    • 빈 문자열(“”) 유효하지 않음
    • /, \, ., ' ', *, <, >, :, |, ?, $, single space, \0(null 문자) 포함 불가
    • 대소문자 구별
    • 최대 64바이트
  • 예약된 데이터베이스 이름: admin, local, config
  • 컬렉션 네임스페이스: {데이터베이스 이름}.{컬렉션 이름}

Data Type

기본 데이터 타입
  • JSON의 키, 값 성질을 유지하면서 추가적인 타입 지원
  • null
  • boolean
  • 숫자
    • 셸에서는 64비트 부동소수점이 기본
    • 4바이트/8바이트의 부호 정수는 각각 NumberInt, NumberLong 클래스 사용
  • 문자열
  • 날짜
    • 시간을 1/1000초 단위로 나타내는 64비트 정수로 저장
  • 정규 표현식 (자바스크립트 문법)
  • 배열(set, list)
  • 내장 도큐먼트
  • 객체 ID(ObjectId())
  • 이진 데이터
  • 자바스크립트 코드
    날짜
  • 자바스크립트의 Date 클래스 사용
  • 새로운 Date 객체를 생성할 때는 항상 new Date()
  • 생성자 호출시, 날짜의 문자열 표현 반환
    배열
  • 정렬 연산에 사용 가능한 값: list, stack, queue
  • 비정렬 연산에 사용 가능한 값: set
  • 서로 다른 데이터 타입 값 포함 가능
  • 중첩 배열 가능
  • 쿼리 가능
  • 배열 이용해 인덱스 생성 가능
    내장 도큐먼트
  • 도큐먼트 안의 도큐먼트
  • 데이터 반복이 생길 수 있음
    ObjectId
  • _id
    • 모든 도큐먼트는 _id 키를 가짐
    • _id 키의 기본형은 ObjectId
    • 도큐먼트를 입력할 때 명시하지 않으면 자동으로 추가됨
    • 하나의 컬렉션에서 _id는 고유한 값을 가짐
  • 24자리 16진수 문자열
  • 첫 4바이트
    • 타임스탬프
    • ObjectId가 대략 입력 순서대로 정렬
    • ObjectId를 효율적으로 인덱싱 가능
    • 1초 동안 여러 장비와 프로세스에 걸쳐 유일성 보장
  • 다음 5바이트
    • 랜덤 값
    • 1초 동안 여러 장비와 프로세스에 걸쳐 유일성 보장
  • 마지막 3바이트
    • 랜덤값으로 시작하는 카운터
    • 1초 내 단일 프로세스 유일성 보장

MongoDB 설치 및 실행(Mac OS)

필수 요건
설치
  • 탭 추가
    brew tap mongodb/brew
    
  • MongoDB 설치
    brew install mongodb-community
    
  • mongod 서버, 샤딩된 클러스터 쿼리 라우터 mongos , MongoDB shell mongosh 포함
실행
  • MongoDB 실행하고 확인하기 (mac OS 서비스로서)
    brew services start mongodb-community
      
    brew services list
      
    // 서비스 끄기
    brew services stop mongodb-community
    
  • MongoDB 실행하고 확인하기 (수동)
    // intel
    mongod --config /usr/local/etc/mongod.conf --fork
    // M1
    mongod --config /opt/homebrew/etc/mongod.conf --fork
      
    ps aux | grep -v grep | grep mongod
    
  • MongoDB 연결 및 사용
    mongosh