프론트엔드

MongoDB

shb 2022. 3. 2. 17:08

MongoDB

* MongoDB의 특징
- NoSQL이기 때문에 관계형 데이터베이스의 테이블 개념이 없음
- 데이터가 모인 하나의 단위를 컬렉션이라고 부름
- 데이터를 정해 놓은 컬럼의 형태로 컬렉션에 넣어야 한다는 제약이 없음
- MongoDB의 데이터베이스는 컬렉션들의 집합
- 컬렉션은 여러개의 문서 객체를 가질 수 있음

예)
{"id":1, "userid":"apple", "userpw":"1111"}
{"id":2, "name":"반하나"}

Database > Collection > Document

document
- RDBMS의 record와 비슷한 개념
- 데이터 구조가 한개 이상의 key-value-pair로 이루어져 있음
- 동적인 스키마를 가지고 있음
- 같은 collection 안에 있는 document끼리 다른 스키마를 가지고 있을 수 있음

collection
- document들의 그룹
- collection 내부에 document들이 위치
- table과 비슷한 개념이지만 RDBMS와 달리 스키마를 따로 가지지 않음

MongoDB 다운로드
https://www.mongodb.com/try/download/community

MongoDB 환경설정
윈도우 검색창에 환경 검색 > "시스템 환경 변수 편집" 클릭 > 환경 변수 버튼 클릭
> 아래쪽에서 Path 변수 찾기 > Path 더블클릭 > 새로 만들기 버튼 클릭
> C:\Program Files\MongoDB\Server\5.0\bin 작성 > 확인으로 전부 닫기
> cmd 다시 켜서 "mongo" 명령어 수행 > ~~~ 메세지 나오면 성공

MongoDB의 문법
데이터베이스 확인
show dbs;

* 데이터베이스 생성
use 데이터베이스명;
use frontend;
데이터베이스가 없으면 생성 후 선택, 있으면 선택
데이터베이스에 자료가 없을 경우 show dbs에 나타나지 않음

* 컬렉션 생성
db.createCollection('컬렉션명');

* 컬렉션 확인
show collections;

* 컬렉션 삭제
db.컬렉션명.drop();

* document 추가
db.컬렉션명.insert({키1:값1,키2:값2,...})

* document 확인
검색
db.컬렉션명.find();

* 구조적으로 정리해서 검색
db.컬렉션명.find().pretty();

* 조건으로 검색
db.컬렉션명.find(객체).pretty();

_id는 각 document의 유일한 키로 쓰이는 고유한 값

* document의 비교연산
- $eq    주어진 값과 일치하는 값을 찾음
- $gt    주어진 값보다 큰 값을 찾음
- $gte   주어진 값보다 크거나 같은 값을 찾음
- $lt     주어진 값보다 작은 값을 찾음
- $lte   주어진 값보다 작거나 같은 값을 찾음
- $ne   주어진 값과 일치하지 않는 값을 찾음
- $in    주어진 배열안에 속하는 값을 찾음
- $nin  주어진 배열안에 속하지 않는 값을 찾음

ex) 포인트가 700 이상인 멤버를 검색
db.member.find({"point":{$gte:700}}).pretty();

* document의 논리연산
- $and    주어진 모든 조건이 true일 때 true
- $or      주어진 조건 중 하나라도 true이면 true
- $not    주어진 조건이 true라면 false, false라면 true

ex)아이디가 "etrog"이고 비밀번호가 "4444"인 멤버를 검색
db.member.find({ $and : [  {"userid":"etrog"},
{"userpw":"4444"}  ] }).pretty();

* 문제
1. 이름이 "박딸기"인 멤버를 검색
db.member.find({"name":"박딸기"}).pretty();

2. 포인트가 800보다 작거나 같은 멤버를 검색
db.member.find({"point":{$lte:800}}).pretty();

3. 아이디가 "banana" 또는 "cherry"인 멤버를 검색
db.member.find({
$or:[
{"userid":"banana"},
{"userid":"cherry"}
]
}).pretty();

4. 성별이 "여자"이고 포인트가 700이상인 멤버를 검색
db.member.find({
$and:[
{"gender":"여자"},
{"point":{$gte:700}}
]
}).pretty();

* document의 정렬
db.컬렉션명.find().sort(객체)

* sort() 의 객체
1. 형태
{필드명:1(-1)}
1은 오름차순, -1은 내림차순
2. 여러 key를 입력할 수 있고, 먼저 입력한 key 대로 정렬

ex) 아이디로 내림차순 정렬
db.member.find().sort({"userid":-1}).pretty();
ex) 포인트로 정렬 후 아이디로 정렬
db.member.find().sort({"point":1,"userid":-1}).pretty();
{apple,700},{durian,500},{banana,500}

* document의 개수 제한
limit() : 출력할 데이터의 개수를 제한할 때 사용
db.컬렉션명.find().limit(출력할개수);

* document의 데이터 생략 후 출력
skip() : 출력할 데이터의 시작부분을 정해준 수만큼 스킵해서 설정
db.컬렉션명.find().skip(생략할개수);

* document의 수정
1. 특정 field 업데이트
db.컬렉션명.update(바꿀객체,{$set:{필드:값,...}})


db.member.update(
{"userid":"grape"},
{$set:{"name":"정포도"}}
)

2. 특정 document replace
db.컬렉션명.update(바꿀객체,새로운객체);


db.member.update(
{"userid":"grape"},
{"userid":"guava","userpw":"9ava","name":"구찬성"}
)
*document replace는 _id가 바뀌지 않음

3. 특정 field 제거
db.컬렉션명.update(바꿀객체,{$unset:{필드:1}})


db.member.update(
{"userid":"grape"},
{$unset:{"userpw":1}}
)
"userpw":1 / 1은 true의 의미

4. 여러 document의 특정 field를 수정
db.컬렉션명.update(바꿀객체,{$set:{필드:값}},{multi:true});

ex) 포인트가 700보다 크거나 같은 document의 비밀번호를 모두 "1234"로 설정
db.member.update(
{"point":{$gte:700}},
{$set:{"userpw":"1234"}},
{multi:true}
);

* document의 삭제
db.컬렉션명.remove(객체);
db.컬렉션명.remove({"userid":"grape"});


1. 데이터 추가
아이디 : julia
비밀번호 : 9999
이름 : 줄리아
성별 : 여자

db.member.insert({"userid":"julia","userpw":"9999",
"name":"줄리아","gender":"여자"})

2. 2000 포인트 추가
db.member.update(
{"userid":"julia"},
{$set:{"point":2000}}
);

3. 비밀번호 변경(0000)
db.member.update(
{"userid":"julia"},
{$set:{"userpw":"0000"}}
)

4. 성별 필드 제거
db.member.update(
{"userid":"julia"},
{$unset:{"gender":1}}
);

5. 줄리아 회원 탈퇴
db.member.remove({"userid":"julia"})