파이널 프로젝트를 할 경우 새로운 스택을 사용해보고 싶은데 그중 하나가 Mongo DB이기 때문에 틈틈히 학습하기 위해 메모해둔 것을 토대로 주말을 활용하여 정리할 계획입니다.
Mongo DB는 NoSQL로, 스키마로 짜지 않고 SQL 데이터베이스에 비해 보다 자유로운 형태로 데이터를 저장할 수 있습니다.
1. 데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우,
2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우,
3. 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트 하는 경우에 NoSQL을 사용합니다.
레플리카 세트
동일한 데이터를 저장하는 소수의 연결된 머신들은 머신 중 하나에 문제가 발생하더라도 데이터가 그대로 유지되도록 합니다.
인스턴스
로컬 또는 클라우드에서 특정 소프트웨어를 실행하는 단일 머신, MongoDB에서는 데이터베이스입니다.
클러스터
데이터를 저장하는 서버 그룹, 인스턴스들의 모임
-> 인스턴스들의 모임을 클러스터라고 한다. 이 클러스터에서 단일 클러스터 안에 있는 여러개의 인스턴스 들은 동일한 복제본들을 가지고 있다. 이를 레플리카 세트라고 한다.
도큐먼트
도큐먼트는 객체와 같이 데이터를 필드-값 쌍(Field - Value pair)으로 저장하고 구성하는 방법입니다.
도큐먼트에서 필드는 데이터의 고유한 식별자이고 값은 주어진 식별자와 관련된 데이터를 뜻합니다.
도큐먼트(Document)
필드 - 값 쌍으로 저장된 데이터
필드(Field)
데이터포인트를 위한 고유한 식별자
값(Value)
주어진 식별자와 관계된 데이터
컬렉션(Collection)
MongoDB의 도큐먼트로 구성된 저장소로 일반적으로 도큐먼트 간의 공통 필드가 있습니다. 데이터베이스 당 많은 컬렉션이 있고 컬렉션 당 많은 도큐먼트가 있을 수 있습니다.
도큐먼트는 json 형태로 저장되어야한다. json은 읽기 쉽지만 파싱이 느리고 메모리사용에 있어서 비효율적이다. 그리고 json은 사용할 수 있는 타입에 제한이 있다. 이러한 문제를 해결하기 위해 bson형식을 사용한다.
먼저 JSON 형식으로 데이터를 가져오고 내보내기 위한 명령어인 mongoimport와 mongoexport가 있고,
BSON 형식으로 가져오고 내보내기 위한 명령어 mongorestore와 mongodump가 있습니다.
몽고디비는 컬렉션과 db를 추가하는 것이 자유로워서 편했습니다. 'use 사용하고싶은db이름' 형태로 입력해주면 바로 db가 생성됩니다. 그리고 그상태에서 컬렉션은
db.컬렉션이름.insert({"test":"1"})
이런 형태로 입력해준다면 새로운 db와 컬렉션에 {"test":"1"}이 들어간 형태의 db가 생성됩니다. 하지만 값을 입력해주지 않는다면 show databases 와 show collections를 하면 보이지 않았습니다. 값을 입력해주어야 저장이 되는 것 같았습니다.
db.collectionName.find({찾는필드:찾는값})
의 형태로 값을 찾을 수 있습니다. 형태는 sequelize cli와 매우 흡사한 것 같아서 금방 익숙해질 수 있겠다고 생각했습니다. mysql처럼 몽고db도 자주 사용할 수 있을 것 같습니다.
find는 count,pretty와 같이 사용되는 경우가 많습니다. 개수를 알고 싶을 때 count를 사용하고 pretty는 json의 형태로 한줄로 쭉 이어지게 값이 나오는 것을 말그대로 이쁘게? 볼 수 있습니다.
db.collectionName.updateMany/One({찾는필드:찾는값}, {"$inc"/"$set"/"$push":{바꿀필드:바꾸는 값})
의 형태로 작성 됩니다.
$inc : 입력값 만큼 값을 증가 > 기존의 값에서 입력 값 만큼 증가 된 값을 저장합니다.
$set : 입력값으로 값을 수정 > 기존 값을 입력 값으로 수정합니다.
$push : 요소를 추가 > 새로운 필드와 값을 추가할 때 사용합니다.
db.collectionName.deleteMany/One({찾는필드:찾는값})
형태로 값을 지울 때 사용합니다.
db.collectionName.drop()
(출처:코드스테이츠)
db.collectionName.find({찾는 필드:{비교 연산자:찾는값}})
의 형태로 입력됩니다.
(출처:코드스테이츠)
and는 기본적으로 find를 사용할 경우 , 가 and의 역할을 합니다.
db.collectionName.find(논리 연산자:[{찾는 필드1:찾는값1}, {찾는 필드2:찾는값2}])
의 형태로 입력할 수 있습니다.
(출처:코드스테이츠)
표현 연산자를 사용할 때에는 비교 연산자를 쓰는 방법이 살짝 다릅니다.
기존의 비교연산자 입력 방법은 db.collectionName.find({찾는 필드:{비교 연산자:찾는값}})
였다면
표현연산자를 사용하고 나면
db.collectionName.find({"$expr":{논리 연산자:[비교연산자:{찾는 필드1:찾는값1}, 비교연산자:{찾는 필드2:찾는값2}]}})
처럼 논리연산자를 사용하는 방법과 같아집니다.
$push를 사용하면 해당 필드를 배열타입의 필드로 바꿀 수 있습니다.
$push : 요소를 추가 > 새로운 필드와 값을 추가할 때 사용합니다.
$all을 사용하면 배열 요소의 순서와 상관없이 지정된 요소가 포함된 모든 도큐먼트를 찾을 수 있습니다.
배열의 길이에 따라 결과 커서를 제한하려면 쿼리에 $size를 추가합니다.
projection, 서브도큐먼트 확인 추가