MongoDB 알아보기
01 Nov 2021몽고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)
필수 요건
- Xcode command-line tool
xcode-select --install
- Homebrew 설치
설치
- 탭 추가
brew tap mongodb/brew
- MongoDB 설치
brew install mongodb-community
mongod
서버, 샤딩된 클러스터 쿼리 라우터mongos
, MongoDB shellmongosh
포함
실행
- 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