2 분 소요

NoSQL

관계형 테이블의 레거시한 방법을 사용하지 않는 데이터 저장소.

NoSQL 데이터베이스를 사용하는 경우

1. 비구조적인 대용량의 데이터를 저장

자유로운 형태의 데이터 저장이 가능. 정형화되지 않은 대용량 데이터가 필요한 경우 NoSQL이 효과적

2. 클라우드 컴퓨팅 및 저장 공간을 최대한 활용

저장 공간 효율적으로 사용. 수평적 확장으로 증설해서 이론상 무한대로 서버를 분산시켜 DB를 증설할 수 있다.

3. 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트

스키마를 미리 준비할 필요가 없어 개발을 빠르게 해야 하는 경우 적합하다.

MongoDB

용어
  • 도큐먼트 필드 - 값 으로 저장된 데이터
  • 필드 데이터 포인트를 위한 교유한 식별자
  • 컬렉션 도큐먼트로 구성된 저장소. 일반적으로 도큐먼트 간의 공통 필드가 있다. 데이터베이스 당 많은 컬렉션이 있고, 컬렉션 당 많은 도큐먼트가 있을 수 있다.
  • 레플리카 세트 동일한 데이터를 저장하는 소수의 연결된 머신. 하나에 문제가 발생해도 데이터를 그대로 유지할 수 있다.
  • 인스턴스 로컬 또는 클라우드에서 특정 소프트웨어를 실행하는 단일 머신. MongoDB에서는 데이터베이스
  • 클러스터 데이터를 저장하는 서버 그룹. 여러 대의 컴퓨터를 네트워크를 통해 연결하여 하나의 단일 컴퓨터처럼 동작하도록 제작한 컴퓨터
Atlas Cloud

MongoDB에서 클라우드에 데이터베이스를 설정할 떄 사용한다. 데이터를 시각화, 분석, 내보내기, 빌드하는 데 사용. 아틀라스 사용자는 클러스터를 배포할 수 있으며, 클러스터는 그룹화된 서버에 데이터 저장

사진

인스턴스들의 모임(클러스터)이 하나의 시스템처럼 작동. 단일 클러스터에서 각각의 인스턴스는 동일한 복제본(레플리카 세트)을 가지고 있다. 클러스터를 이용하여 배포할 경우 자동으로 레플리카 세트 생성.

JSON vs BSON

JSON
작성방법
  • {} 중괄호로 도큐먼트가 시작하고 끝나야 한다.
  • 필드와 값이 :으로 분리, 필드와 값을 포함하는 쌍은 ,로 구분
  • 문자열인 필드 ""로 감싸기
  • 위 조건 어느 하나라도 충족되지 않으면 유효한 도큐먼트가 아니다.
  • 작성 예시
    {
    "_id" : "20220128",
    "date" : ISODate("2022-01-28-T05:00:00Z"),
    "listing_id" : "1038163",
    "reviewer_id" : "777888",
    "reviewer_name" : "Kim",
    "comments" : "It is So Easssssy(?)."
    }
    
JSON 단점
  • 텍스트 형식이기 때문에 읽기 쉽지만 파싱이 느리고 메모리 사용이 비효율적
  • 기본 데이터 타입만 지원하기 때문에 사용할 수 있는 데이터 타입에 제약

이를 해결하기 위해 BSON(Binary JSON) 형식 도입

BSON

컴퓨터 언어에 가까운 이진법에 기반을 둔 표현법.

장점
  • JSON보다 메모리 사용 효율적
  • 빠르고, 가볍고, 유연하다.
  • 더 많은 데이터 타입 사용 가능

MongoDB는 JSON 형식의 데이터를 데이터베이스에 추가할 수 있고 쉽게 조회할 수 있다. 하지만 내부에서는 속도, 효율성, 유연성의 장점이 있는 BSON으로 데이터를 저장, 사용한다.

MongoDB 데이터 가져오기 / 내보내기
  • 내보내기(Export)

    // BSON Export
    mongodump --uri "<Atlas Cluster URI>"
    
    // JSON Export
    mongoexport --uri "<Atlas Cluster URI>"
                --collection=<collection name>
                --out=<filename>.json
    
  • 가져오기(Import)

    // BSON Import
    mongostore --uri "<Atlas Cluster URI>"
               --drop dump
    
    // JSON Import
    mongoimport --uri "<Atlas Cluster URI>"
                --drop=<fimename>.json
    
    // 기존에 있는 데이터를 삭제하기 위한 옵션인 drop 쿼리문은 선택적으로 사용할 수 있다.
    

MongoDB CRUD

CREATE
  • insert(): db.collection_name.insert(json_type_data)
    • Insert 명령어 사용시 주어진 도큐먼트 배열의 인덱스 순으로 작업 실행. ordered를 추가하면 순서에 상관없이 고유한 _id를 가진 도큐먼트는 모두 컬렉션에 삽입
  • find(): db.collection_name.find(query, projdction)
READ
  • show dbs: 데이터베이스 조회
  • use database_name: 사용할 데이터베이스로 이동
  • show collections: collection 조회
  • find: db.collection_name.find({조건})
    • db.zips.find({“state”:’NY}): zips 컬렉션에서 state가 NY인 데이터 랜덤으로 20개 조회
    • db.zips.find(): zips 컬렉션의 모든 데이터 조회
    • db.zips.findOne({조건}): zips 컬렉션의 데이터 중 하나만 조회
    • db.zips.findOne(): zips 컬렉션의 데이터 중 무작위로 하나 조회
  • count: db.collection_name.find().count(): 선택한 컬렉션에 데이터 갯수 출력

※ pretty(): 쿼리문 맨 뒤에 붙여서 조금 더 보기 편하게 출력한다.

UPDATE
  • db.zips.updateMany({“city”:”ALPINE},{“$inc”:{“pop”:10}}): city가 ALPINE인 값 중 pop을 10만큼 증가
    • $inc : 특정한 필드의 값을 주어진 값만큼 증가. 다양한 필드의 값을 동시에 업데이트 할 수도 있다.
  • db.zips.updateOne({“zip”:”12534”},{“$set”:{“pop”:6253}}): zip이 12534인 값 중 pop을 6253으로 업데이트. 필드가 없으면 에러가 나지 않고 필드와 값이 입력된다.
    • $set : 주어진 필드에 지정된 값 업데이트
  • db.grades.updateOne({“student_id”:250,”class_id”:339},{“$push”:{“scores”:{“type”:”extra credit”,”score”:100}}}): 배열로 이루어진 필드의 값에 해당 서브 도큐먼트를 추가 => {“type”:”extra credit”,”score”:100} 형태의 서브 도큐먼트를 scores 필드의 값인 배열에 추가
DELETE
  • deleteOne: 주어진 기준에 맞는 도큐먼트들 중 첫번째 도큐먼트 삭제
  • deleteMany: 쿼리문과 일치하는 모든 도큐먼트 삭제
  • db.collection_name.drop(): 컬렉션 삭제