[mongoDB] 몽고DB
NoSQL
Not only SQL의 약자입니다. 기존의 RDBMS(관계형 데이터베이스)의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터베이스입니다. 관계형 DB가 아니므로 RDBMS처럼 고정된 스키마(테이블의 틀) 및 JOIN문이 존재하지 않습니다.
NoSQL을 사용하는 이유
가장 큰 이유는 성능 때문입니다. 관계형 데이터베이스는 시스템의 신뢰도를 높이는데 필요한 장치를 많이 가지고 있습니다. SQL문을 읽고 실행하는데 많은 리소스를 사용하며 성능이 떨어지는 경우가 많습니다. 반대로 NoSQL은 성능을 최우선으로 생각하여 실시간으로 처리해야 할 경우나 대용량 트래픽을 감당할 수 있는 메시징 시스템 등에 활용됩니다.
회원정보등의 DB는 SQL쪽이 좋고 글을 적고 지우고를 많이하는 SNS같은 곳에서는 NoSQL이 좋다.
mongoDB 특징
- NoSQL이기 때문에 관계형 데이터베이스의 테이블 개념이 없습니다.
- 데이터가 모인 하나의 단위를 컬렉션이라고 부릅니다.
- 데이터를 정해 놓은 컬럼의 형태로 컬렉션에 넣어야 한다는 제약이 없습니다.
- mongoDB의 데이터베이스는 컬렉션의 집합이라고 할 수 있습니다.
- 컬렉션은 여러개의 문서 객체를 가질 수 있습니다. 문서 객체는 속성들의 집합으로써 한 사람의 이름과 나이등을 저장하고 있는 하나의 문서 객체를 만든 후 그 안에 자바스크립트 객체와 같이 속성들을 추가하여 저장할 수 있습니다.
- 자바스크립트처럼 객체형으로 들어가있는데 그것을 다큐먼트(document)라고 부른다.
데이터
{"id":1, "userid":"apple", "userpw":"1111" ..} -> document
document 모이면 -> collection(관계형DB table과 비슷하다고 생각하면 된다) 모이면 -> database
document
- RDBMS의 record(row)와 비슷한 개념입니다.
- 데이터 구조는 한 개 이상의 key-value-pair로 이루어져 있습니다.
- Document는 동적(dynamic)의 schema 를 갖고있습니다. 같은 Collection 안에 있는 Document 끼리 다른 schema 를 갖고 있을 수 있는데요, 쉽게 말하면 서로 다른 데이터 (즉 다른 key) 들을 가지고 있을 수 있습니다.
하나의 collection 안에
{"id":1, "userid":"apple", "userpw":"1111"}
{"name":"김사과", "age":40}
{"id":1, "userid":"apple", "userpw":"1111", gender:"남자"}
{"id":1, "userid":"apple", "userpw":"1111", "username":"김사과"}
이렇게 key값이 다른 여러 개의 document가 들어갈 수 있습니다.
collection
- mongoDB의 document그룹입니다.
- collection 내부에 document들이 위치하고 있습니다.
- RDBMS의 table과 비슷한 개념이지만 RDBMS와 달리 스키마를 따로 가지지 않습니다.
mongoDB 환경설정
윈도우
파일탐색기 -> 내 PC -> 마우스 오른쪽 버튼(속성) -> 고급 시스템 설정 -> 환경 변수 -> 시스템 변수 -> path -> 편집 -> 새로 만들기 -> C:\Program Files\MongoDB\Server\4.4\bin
(mongoDB 실행파일 위치)
맥
아래 글 참조해주세요.
meanbymin.tistory.com/77?category=952552
[mongoDB] 맥북 빅서(big sur)에서 mongoDB 설치, 설정하기.
맥은 무슨 프로그램 하나 깔아서 실행할 때 마다 이렇게 고생을 하냐!!!! 제목에 빅서(big sur)라고 적은 이유는 Mac OS가 계속 계속 업데이트가 되어가면서 권한 설정이 변화가 되면서 맥 카탈리나(C
meanbymin.tistory.com
확인
cmd 혹은 terminal 에서 mongo 기입 후 엔터
MongoDB 문법
데이터베이스 확인
show dbs;
데이터베이스 생성 및 선택
use 데이터베이스명;
use frontenddb;
데이터베이스가 없으면 생성하고 있으면 사용하게 된다.
** 데이터베이스를 오타를 치면 데이터베이스를 새로 만들어서 들어가기 때문에 오타 조심!
** 데이터베이스의 자료가 없을 경우 show dbs에서 나타나지 않습니다.
컬렉션 생성
db.createCollection('컬렉션명');
db.createCollection('testCollection');
컬렉션 확인
show collections;
컬렉션 삭제
db.컬렉션명.drop();
db.testCollection.drop();
연습용 컬렉션 만들기
db.createCollection("member")
document 추가
db.컬렉션명.insert(객체);
db.member.insert({'userid':'apple','userpw':'1111'});
db.member.insert({'userid':'banana','userpw':'2222','username':'반하나'});
db.member.insert({"userid":"orange","userpw":"3333","gender":"남자"});
db.member.insert({"userid":"melon","userpw":"4444","gender":"남자", "username":"이메론"});
db.member.insert({"userid":"cherry","userpw":"5555","username":"채리", "gender":"여자","point":2000});
db.member.insert({"userid":"avocado","userpw":"6666","username":"안카도", "gender":"남자","point":1500});
db.member.insert({"userid":"berry","userpw":"7777","username":"배애리", "gender":"여자","point":1800});
db.member.insert({"userid":"coconut","userpw":"8888","username":"고코넛", "gender":"남자","point":1700});
document 확인
db.컬렉션명.find();
db.컬렉션명.find().pretty();
db.컬렉션명.find(객체).pretty();
db.member.find();
db.member.find().pretty();
db.member.find({"userid":"apple"}).pretty();
* _id는 각 document의 유일한 키로 쓰이는 값입니다. RDBMS에서 auto_increment와 비슷하다
document 비교연산
$eq : 주어진 값과 일치하는 값을 찾습니다.
$gt : 주어진 값보다 큰 값을 찾습니다.
$gte : 주어진 값보다 크거나 같은 값을 찾습니다.
$lt : 주어진 값보다 작은 값을 찾습니다.
$lte : 주어진 값보다 작거나 같은 값을 찾습니다.
$ne : 주어진 값과 일치하지 않는 값을 찾습니다.
$in : 주어진 배열 안에 속하는 값을 찾습니다.
$nin : 주어진 배열 안에 속하지 않는 값을 찾습니다.
문제
포인트가 1700점 이상인 멤버를 검색합니다.
db.member.find({point:{$gte:1700}}).pretty();
document 논리연산
$or : 주어진 조건 중 하나라도 true일 때 true인 결과를 찾습니다.
$and : 주어진 모든 조건이 true일 때 true인 결과를 찾습니다.
$not : 주어진 조건이 false일 때 true, true일 때 false인 결과를 찾습니다.
문제
아이디가 "melon"이고 이름이 "이메론"인 멤버를 검색합니다
db.member.find({$and:[{"userid":"melon"},{"username":"이메론"}]}).pretty(); // find안에는 객체가 무조건 들어가야하고 2개 이상은 배열로 감싼다.
실습
1. 이름이 "안카도"인 멤버를 검색합니다.
db.member.find({"username":"안카도"}).pretty();
2. 포인트가 1800보다 작거나 같은 멤버를 검색합니다.
db.member.find({"point":{$lte:1800}}).pretty();
3. 아이디가 "apple" 이거나 "banana"인 멤버를 검색합니다.
db.member.find({$or:[{"userid":"apple"},{"userid":"banana"}]}).pretty();
4. 성별이 "여자"이고 포인트가 1700이상인 멤버를 검색합니다.
db.member.find({$and:[{"gender":"여자"},{"point":{$gte:1700}}]}).pretty();