::: IT인터넷 :::

MongoDB의 Database와 Collection 사용하기

곰탱이푸우 2022. 8. 4. 08:20
Docker를 이용하여 MongoDB를 설정했다면 실제 명령어를 사용해 볼 필요가 있다.
Database와 Collection을 사용하는 방법에 대해 알아본다.
 
MongoDB의 Document 구조와 관계 패턴은 아래 포스팅을 참고한다.
MongoDB의 구조와 특징은 아래 포스팅을 참고한다.
 

준비 사항

DB 명령어는 MongoDB Docker 컨테이너 내부에서 mongosh를 실행해서 진행한다.
 
Docker를 이용한 MongoDB 설정과 mongosh 실행 방법은 아래 포스팅을 참고한다.

Database 관리

Database 개념

Database는 RBMDS의 Database 용어와 유사하다.
MongoDB에서 Table 역할을 수행하는 다수의 Collection들을 포함한다.
따라서 Database는 프로젝트나 서비스 단위로 구분할 수 있다.
 
Database, Collection, Document의 관계는 다음과 같이 표현 가능하다.
 

Database 생성과 전환

use  명령을 사용하면 Database를 생성하거나 전환할 수 있다.
이미 존재하는 Database인 경우 전환되며, 존재하지 않으면 새로운 Database를 생성한다.
# 기본 형식
> use Database이름
switched to db Database이름
Database이름>

# 실제 예제
> use local
switched to db local
local>
 
생성 또는 전환이 완료되면 프롬프트 부분에 현재 사용 중인 Database의 이름이 표시된다.
 
Database 생성은 관리자 권한 또는 생성 권한이 있어야 한다.
또한 신규 Database는 최소 1개 이상의 Document가 추가되어야 목록에 표시되는 것을 참고한다.
 
 

Database 목록 조회

현재 MongoDB에 생성되어 있는 Database의 목록을 확인하기 위해서는 아래 명령을 사용한다.
dbtest> show dbs
admin      102 kB
config    73.7 kB
local    81.9 kB
 
생성 된 Database의 이름과 저장 된 데이터의 용량이 표시 된다.
 
새로 Database를 생성하면 목록에 바로 보이지 않는데 최소 1개 이상의 Document가 추가되어야 한다.
# Document를 추가할때 Collection을 암시적으로 생성하는 방법은 4.4 버전부터 가능
dbtest> db.book.insertOne({"name": "MongoDB Tutorial", "author": "Joe"})
{
  acknowledged: true,
  insertedIds: { '0': ObjectId("626b879d65644e076f78f82b") }
}

dbtest> show dbs
admin      102 kB
config    98.3 kB
dbtest      41 kB
local    81.9 kB
 

Database 삭제

Database를 삭제하기 위해서는 아래 명령을 사용한다.
Database 삭제는 관리자 권한 또는 삭제 권한이 있어야 한다.
# 기본 형식
> use Database이름
> db.dropDatabase()

# 실제 예제
dbtest> use dbtest
already on db dbtest

dbtest> db.dropDatabase()
{ ok: 1, dropped: 'dbtest' }

dbtest> show dbs
admin      102 kB
config    111 kB
local    81.9 kB
 
내부에 Collection과 Document가 있어도 경고 메시지 없이 삭제한다.
삭제할 Database로 전환하지 않을 경우 데이터 유실이 발생할 수 있으므로 주의해야 한다.
 
 

Collection 관리

Collection 개념

RDBMS의 Table과 유사한 개념으로 데이터를 구성하는 다수의 Document를 포함한다.
Schemaless인 MongoDB의 Collection은 동적 스키마를 가지므로 모든 Document가 다른 구조를 가질 수도 있다.
  • 동일 Collection에 다양한 구조의 Document가 포함되면 관리하기 어렵다.
  • 특정 유형의 데이터를 추출하기 위해 매번 필터링 해야 하므로 속도가 느리다.
 
이러한 이유로 성격과 목적이 다른 Document들은 별도의 Collection으로 분리하는 것이 권장된다.
  • 데이터의 구조와 목적에 따라 Collection을 분리하므로 관리가 수월하다.
  • 특정 Collection에서 조회만 수행하는 것이 훨씬 빠르다.
  • 필요한 데이터가 인근에 모여 있기 때문에 지역성 좋아서 속도가 빠르다.
  • Collection의 데이터 구조가 거의 동일하게 유지되므로 효율적으로 인덱싱 할 수 있다.
 
정리하면 Collection의 생성과 관리는 RDBMS의 테이블 개념을 적용하면 도움이 된다.
 
관련 내용은 아래 포스팅의 Document 구조의 정리 항목을 참고한다.
 

Collection 생성

Database 내에 데이터를 분리하기 위한 Collection을 생성해야 한다.
직접 생성하지 않고 Document를 추가하면 지정한 이름의 Collection이 기본 옵션으로 생성된다.
그러나 직접 추가하면 세부적인 옵션을 지정할 수 있다.
 
기본 명령어 형식은 다음과 같다.
> db.createCollection(Collection이름, [options])
 
options 부분은 Document 형태의 키 - 값 형태로 구성되며, Optional이므로 필요에 따라 설정해야 한다.
자주 사용하는 옵션은 다음과 같다.
구분
타입
기본값
내용
capped
Boolean
false
컬렉션의 고정 크기 지정하여 초과하면 오래 된 데이터부터 제거
true로 설정하면 size (크기) 값 설정 필요
size
number
 
capped 설정이 true인 경우 Collection의 최대 크기 지정 (bytes 단위)
max
number
 
해당 Collection에 추가할 수 있는 Document의 최대 개수
 
그 외에도 Document의 유효성 검사 (validator), 데이터 정렬 (collation) 등도 구성할 수 있다.
나머지 옵션들은 아래 기술 문서를 참고한다.
다음과 같이 생성할 수 있다.
# 기본값 사용
> use dbtest
> db.createCollection("books")
{ "ok" : 1 }

# 옵션 지정
> db.createCollection("reviews", {
      capped: true,
      size: 512000,
      max: 20000
  })
{ "ok" : 1 }

# 자동 생성 (4.4 버전부터 지원)
> db.publisher.insertOne( {"name": "doremi", "tel": "02-123-4567"} )
{
  acknowledged: true,
  insertedId: ObjectId("626b93f465644e076f78f82d")
}
 

Collection 목록 조회

현재 Database에 생성 되어 있는 Collection의 목록을 확인하는 방법은 다음과 같다.
# 기본 형식
> use Database이름
Database이름> show collections

# 사용 예제
> use dbtest
dbtest> show collections
book
publisher
reviews
 
 

Collection 삭제

불필요하거나 잘못 생성한 Collection은 삭제해야 한다.

 

삭제하는 방법은 다음과 같다.
# 기본 형식
> use Database이름  # Database 전환
Database이름> show collections  # 삭제할 Collection 이름 확인
Database이름> db.Collection이름.drop()

# 사용 예제
> use dbtest
dbtest> show collections
dbtest> db.publisher.drop()
true
 
내부에 Document가 있어도 경고 메시지 없이 삭제한다.
삭제할 Database로 전환하지 않았거나 이름을 잘못 지정할 경우 데이터 유실이 발생할 수 있으므로 주의해야 한다.