본문 바로가기

DB/MongoDB

[MongoDB] 기본설명

1. 도큐먼트

정렬된 키와 연결된 값의 집합으로 이루어져 있다.

도큐먼트의 키는 문자열이다. 다음 예외 몇 가지를 제외하면 어떤 UTF-8 문자든 쓸 수 있다.

  • 키는 \0(null 문자)을 포함하지 않는다. \0은 키의 끝을 나타내는데 사용된다.
  • "."과 "$"문자는 몇 가지 특별한 속성을 가지며 특정 상황에서만 사용해야한다.(이후 작성 예정, 예약어로 취급) 

특징

1) 몽고DB는 데이터형과 대소문자를 구별한다.

다음 두 도큐먼트는 서로 다르다.
{"count" : 5}
{"count" : "5"}

다음 두 도큐먼트도 마찬가지다.
{"count" : 5}
{"Count" : 5}

 

2) 몽고DB에서는 키가 중복될 수 없다.

다음 다큐먼트는 존재할 수 없다.
{"userId" : "oss0202", "userId" : "oss0202"}

 

 

2. 컬렉션

도큐먼트의 모음이다.

관계형 데이터베이스 몽고DB
테이블 컬렉션
도큐먼트

 

1) 동적 스키마

하나의 컬렉션 내 도큐먼트들이 모두 다른 구조를 가질 수 있다.

예제
{"uerId" : "oss0202", "userNm" : "오성식"}
{"itemId" : "20970002023", "logisClsCd" : "11", "logisItemNm" : "홈런볼"}

 

그런데 다른 구조의 도큐먼트라도 같은 컬렉션에 저장할 수 있는데 "왜 별도의 컬렉션이 필요하지?" 라고 생각이 든다.

다음과 같은 몇 가지 이유가 있다.

 

(1) 관리가 어렵다.

  • 사이트의 게시글 중에서 특정 사용자의 데이터에 대해서 추출하거나 작업을 할 때 다른 데이터들과 구분하기 어렵다.

(2) 집계를 낼 때 속도가 빠르다.

  • 컬렉션별로 목록을 뽑으면 한 컬렉션 내 특정 데이터형별로 쿼리해서 목록을 뽑을 때보다 훨씬 빠르다.
  • 블로그의 게시물 여러개를 뽑는 경우. 게시물과 작성자 정보가 섞인 컬렉션보다 게시물만 들어 있는 컬렉션에서 뽑을 때 기스크 탐색시간이 더 짧다.
  • 데이터 지역성(data locality)에 좋다.

(3) 인덱스를 만들 때 효율적이다.

  • 인덱스를 만들면 도큐먼트는 특정 구조를 가져야 한다.(고유 인덱스일 경우 특히 그렇다.)
  • 하나의 컬렉션에 넣음으로써 컬렉션을 효율적으로 인덱싱할 수 있다.

 

2) 네이밍

컬렉션은 이름으로 식별된다.

(1) 서브 컬렉션

서브컬렉션(subcollection)의 네임스페이스(namespace)에 .(마침표) 문자를 이용해 컬렉션을 체계화 한다.

예를 들어 블로그 기능이 있는 어플리케이션의 컬렉션들을 다음과 같이 정의할 수 있다.

더보기

blog.userInfo

blog.post

blog.img

...

이는 단지 체계화를 위함이며 컬렉션간에는 아무런 관계가 없다.

서브 컬렉션은 특별한 속성은 없지만 여러 몽고DB 툴에서 지원하므로 유용하다.

 

 

3. 데이터베이스

컬렉션에 도큐먼트를 그룹화할 뿐 아니라 데이터베이스에 컬렉션을 그룹지어 놓는다. 단일 인스턴스는 여러 데이터베이스를 호스팅할 수 있으며, 각 데이터베이스를 완전히 독립적으로 취급할 수 있다. 한 애플리케이션의 데이터를 동일한 데이터베이스에 저장하는 것은 좋은 방식이다. 데이터베이스를 나누면 하나의 몽고DB 서버에서 여러 애플리케이션이나 여러 사용자 데이터를 저장할 때 유용하다.

 

4.몽고DB 시작

1) 설치 : https://www.mongodb.com/try/download/community

 

Try MongoDB Community Edition

Try MongoDB Community Edition on premise non-relational database including the Community Server and Community Kubernetes Operator for your next big project!

www.mongodb.com

 

2) 환경설정 > Path에 경로 추가

 

3) 환경설정 완료 후 cmd창을 열어서 'mongod'명령어 실행

  • 이때 다음과 같이 Data directory Exception이 발생할 것이다. 이때 "C:/data/dbpath/db/"폴더를 생성해 주거나 '--dbpath'옵션을 사용해서 경로를 지정해줘야합니다. (저는 위 경로 폴더를 생성해 주고 실행하였습니다.

폴더 생성/dbpath경로를 지정하지 않았을 경우 발생하는 Exception

4) "3."을 진행 후 다시 mongod를 실행하면 정상적으로 실행됩니다.

  • 몽고DB의 기본포트는 27017입니다.(mongod.cfg파일에서 수정 가능)

 

5) MongoDB Shell 접속을 위해서 Shell 다운로드

 

Try MongoDB Tools - Download Free Here

Free download for MongoDB tools to do more with your database. MongoDB Shell, Compass, CLI for Cloud, BI Connector and other database tools available.

www.mongodb.com

  • 환경변수에 'mongosh.exe' 경로 추가
    •  

 

6) 'mongosh'를 통한 쉘 접속

  • 쉘은 자바스크립트 프로그램을 실행한다. 그래서 다음과 같은 라이브러리/연산을 사용할 수 있다.

 

[MongoDB] 기본적인 명령어 - jinShine

기본 명령어 들어가기에 앞서, mongo Shell에서 쓰이는 문법은 기본적으로 Javascript로 되어 있습니다. 서버실행 mongod 서버 접속 mongo 서버 접속 까지 완료해줍니다. DB 생성 use DATABASE_NAME명령어를 통

jinshine.github.io

 

5.몽고DB 데이터형

  • 도큐먼트는 자바스크립트 객체와 개념적으로 닮았다는 점에서 'JSON과 닮았다'라고 생각할 수 있다.JSON(http://www.json.org 참조)은 6가지의 데이터형을 가지고 있으며, 구문을 분석(parse)하고, 기억하기 쉬워서 여러 방면에서 유용하게 사용한다.
    • JSON 데이터형식
      1. 숫자(number)
      2. 문자열(string)
      3. 불리언(boolean)
      4. 객체(object)
      5. 배열(array)
      6. NULL
  • 그러나 6가지의 데이터형식만 지원하기 때문에 JSON의 표현력은 제한적이다. JSON은 날짜형이 없어 날짜를 다루기 어렵고, 부동소수점형과 정수형을 표현하는 방법도 없다. 
  • 몽고DB는 JSON의 키/값 쌍 성질을 유지하면서 추가적인 데이터형을 지원한다.
    • 몽고DB 데이터형식
      1. 숫자(number)
        • 셸은 64비트 부동소수점 수를 기본으로 사용한다.
        • {"x" : 3.14}
        • {"x" : 3}
      2. 문자열(string)
        • 어떤 UTF-8 문자열이든 문자열형으로 표현할 수 있다.
        • {"x" : "ssg"}
      3. 불리언(boolean)
        • 참과 거짓 값에 사용한다.
        • {"x" : true}
      4. 배열(array)
        • 값의 셋이나 리스트를 배열로 표현할 수 있다.
        • {"x" : ["2550", "2448", "2331"]}
      5. NULL
        • null 값과 존재하지 않는 필드를 표현하는 데 사용한다.
        • {"x" : null}
      6. 날짜(date)
        • 몽고DB는 1970년 1월 1일부터의 시간을 1/1000초 단위로 나타내는 64비트 정수로 날짜를 저장한다. 표준 시간대(time zone)는 저장하지 않는다.
        • {"x" : new Date()}
      7. 정규표현식(regex)
        • 쿼리는 자바스크립의 정규 표현식 문법을 사용할 수 있다.
        • {"x" : /oss0202/i}
      8. 내장 도큐먼트
        • 도큐먼트는 부모 도큐먼트의 값으로 내장된 도큐먼트 전체를 포함할 수 있다.
        • {"x" : {"comm", "shpp"}}
          • 장점
            • ex. 'people'도큐먼트 내에 바로 'city'도큐먼트를 내장할 수 있다.
          • 단점
            • RDB보다 더 많은 데이터 반복이 생길 수 있다.
            • ex. 관계형 데이터베이스에서 people, city 테이블이 분리되어 있을 때, city의 street명이 변경되었을 때, RDB의 경우 where 및 join을 통해서 모든 데이터를 쉽게 수정할 수 있다. 그러나 몽고DB의 경우 각 사람의 도큐먼트에 있는 모든 데이터를 수정해야한다.
      9. 객체 ID
        • 객체 ID는 도큐먼트용 12바이트 ID이다.
        • {"x" : ObjectId()}
      10. 이진 데이터
        • 이진 데이터는 임의의 바이트 문자열이며 셸에서는 조작이 불가능하다.
        • 이전 데이터는 데이터베이스에 UTF-8이 아닌 문자열을 저장하는 유일한 방법이다.
      11. 코드
        • 쿼리와 도큐먼트는 임의의 자바스크립트 코드를 포함할 수 있다.
        • {"x" : function() {/* ... */}}
 

Change time zone in MongoAtlas

Hello, new to Atlas. At the moment data is written to my databases as 2020-12-16T02:26:11.415+00:00. I don’t understand how to change the default settings so information is written in the DB according to my timezone. That time stamp is showing that it wa

www.mongodb.com

 

6. _id와 ObjecId

몽고DB에 저장된 모드 도큐먼트는 '_id'키를 가진다.

  • 각 컬렉션에서 고유하다.

1) ObjectId 클래스

'_id'의 기본 데이터형이다. 자동 증가하는 기본 키처럼 전통적인 것이 아닌 ObjectId를 사용하는 이유는 몽고DB의 분산 특정 때문이다. 여러 서버에 걸쳐 자동으로 증가하는 기본 키를 동기화하는 작업은 어렵고 시간이 걸린다. 몽고DB는 분산 데이터베이스로 설계됐기 때문에 샤딩된 환경에서 고유 식별자를 생성하는 것이 매우 중요했다.

  • 12바이트 스토리지, 24자리 16진수 문자열 표현 가능
  • 구성

 

ObjectId() — MongoDB Manual

Docs Home → MongoDB Manual ObjectId( )Returns a new ObjectId. The 12-byte ObjectId consists of:A 4-byte timestamp, representing the ObjectId's creation, measured in seconds since the Unix epoch.A 5-byte random value generated once per process. This rando

www.mongodb.com

 

  • 타임스탬프가 맨 처음 오기 때문에 ObjectId가 대략 입력 순서대로 정렬된다. 하지만 이는 보장되지 않는다.
  • 서버시각을 동기화하지 않아도 된다. 단지 1초에 한 번씩 생성되고 증가할 뿐이다.
  • 고유한 ObjectId는 프로세스당 1초에 256^3(1677만 7216)개 까지 생성된다.

 

 

2) _id 자동생성

도큐먼트를 생성할 때 '_id'를 명시하지 않으면 자동으로 추가된다.

 

 

 

 

 

'DB > MongoDB' 카테고리의 다른 글

[MongoDB] MongoDB란  (0) 2023.05.28