minlog
article thumbnail

 

Mongo DB 사용하기

MongoDB 구성
 데이터베이스 👉  컬렉션  👉  도큐먼트 

 

0  . 터미널에서 셸 접속

명령어 mongosh 입력

 

 


 

1. 데이터베이스

1-1. DB 목록 조회

show dbs

 

1-2.  셋팅된 DB 확인

db

 

1-3. DB 생성 / 사용 선택

use 명칭

  • 바로 생성한 DB 사용으로 변경됨.
  • 실제 데이터를 입력하지 않은면 show dbs 를 해도 나오지 않는다.
  • 데이터를 가지고 있어야함.

 

1-4. DB 지우기

db.dropDatabase()

  • 제거하려는 db로 접속
  • 위의 명령어 입력

 


 

2.  컬렉션

 

2-1.컬렉션 생성

- 기본 컬렉션 생성

db.createCollection("user",{})

 

2-2. 현제 DB의 컬렉션 상태

- DB안에 컬랙션 리스트 조회

db.getCollectionNames() 또는 show collections

 

- 호스트,프로세스, ID,Lock옵션,스토리지 엔진 이름,통계 정보제공

db.serverStatus()

 

- 데이터베이스 내의 컬렉션, 뷰,오브젝트 개수외 크기 통계 제공

db.stats()

 

2-3.컬렉션 삭제 또는 이름 변경

- 삭제

db.user.drop()

- 이름변경 

db.collection.renameCollection(변경이름) 

 

 


 

3. 도큐먼트 - CRUD

3-1. 생성 ( Create )

-  insertOne : 하나 생성

db.컬렉션이름.insertOne({name:'jimin'})

 

- insertMany : 여러개 생성

  • 내부에 [ ] 배열로 해서 여러 데이터를 추가할 수 있다.

db.mongotest.insertMany([{name:'jimin',age:10},{name:'tom',age:20}])

 

 

3-2. 검색

- findOne : 하나 검색

db.컬렉션이름.findOne({검색조건},{출력내용})

출력 내용에는 예를들어 이름 과 나이가 문서에 들어있는 상황에서 이름만 뽑고 싶다면 아래와 같이 조회하면된다. 

db.컬렉션이름.findOne({name:'jimin'},{_id:0,name:1,age:0})

 

  • 처음 등록된 배열 0 번째 인덱스 반환
    db.mongotest.findOne({});
  • 지민이라는 이름의 문서 반환 

        db.mongotest.findOne({name:'jimin'})

  • 조건 검색
    • 나이가 10인 조건 : testdb1> db.mongotest.findOne({age:10})
    • 나이가 11 이상인 조건 : testdb1> db.mongotest.findOne({age:{$gt : 11}})

 

-  find : 전체 검색
db.컬렉션이름.find()

 

3-3. 삭제

- deleteOne : 하나 삭제
- deleteMany : 여러개 삭제

 

3-4. 수정

- updateOne : 하나 업데이트
- updateMany : 여러개 업데이트

[ 업데이트 연산자 ]

연산자 이름 용도
$set 특정 키의 값 수정
$inc 숫자타입 필드 값을 증가 할때
$dec 숫자타입 필드 값을 감소 할때
$unset 특정 키와 값 모두 제거
$nc 배열 사용되는 제한자, 지정된 키가 존재하는지 확인
$push 배열에 사용되는 제한자, 지정된 키가 존재할 때 해당 키의 끝에 요소를 추가 하거나 키가 존재하지 않을시 새로운 배열 추가
$pull 배열에 사용되는 제한자, 지정된 키에 대한 요소 삭제
$addToSet 배열에 사용되는 제한자, 중복을 피해서 요소를 배열에 추가
$each $addToSet 과 함께 사용되는 제한자, 여러개의 값을 중복되지 않게 배열에 추가
$pop 배열을 스텍이나 큐처럼 활용.

 


 

4. 연산자

4-1. 비교 연산자

연산자 이름 의미
$eq 필드_값 == 값
$ne 필드_값 != 값
$gt 필드_값 > 값
$gte 필드_값 >= 값
$lt 필드_값 < 값
$lte 필드_값 <= 값

 

4-2. 연산자

연산자 이름 의미
$in 매치되는 문서를 반환
$nin 매치되지 않는 문서를 반환

 

4-3. 논리 연산자

연산자 이름 의미
$and 모든 검색 조건을 모두 만족하는 문서
$not 모든 검색 조건을 모두 만족하지 않는 문서
$or 모든 검색 조건 중 하나라도 만족하는 문서
$nor 모든 검색 조건 중 하나라도 만족하지 않는 문서

 

4-4 . 정규식 연산자

const re = new RegEx(정규식)
const re = /정규식/
db.user.find({name:{$regex:/*j+$/}})

 

🍫 문제 풀어보기

더보기

문제1. 창고에서 물품을 정리해야 한다.
측정된 물품의 단위가 in인 물품을 cm로 바꾸려고 한다.
단위가 in인 물품의 목록을 찾아보자.

==>  db.mongotest.find({"size.uom":'in'})

문제2. 창고에 C급, D급인 물품을 찾아서 절반정도의 물량을 창고에서 버리려고 한다. 창고에 C급,D급인 물품을 모두 찾아보자.

==> testdb1> db.mongotest.find({"status": {$in:['C','D']}})


문제3. B창고에 길고 가느다란 공간이 비어서 그 빈 공간을 채우기 위해 폭(w)이 15cm보다 작고 높이(h)가 50cm이상, 100cm이하인 물품을 찾아서 채워넣으려고 한다.

==> db.mongotest.find({$and:[{"size.w": {$lt:15}},{"size.h": {$gte:50}},{"size.h":{$lte : 100}}]})




CRUD 문제 
1. testdb1 , people 컬렉션을 생성하여 아래 
   기본 데이터를 입력해주세요.
{ “name”: “Kim”, “age”: 21 },
{ “name”: “Lee”, “age”: 22 },
{ “name”: “Jung”, “age”:27},
{ “name”: “Park”, “age”: 27, “skills”: [ “mongodb”, “python”] },
{ “name”: “Choi”, “age”: 22, “score”: 10 }


==> db.people.insertMany([{"name": "Kim", "age": 21 },
{ "name": "Lee", "age": 22 },
{ "name": "Jung", "age":27},
{ "name": "Park", "age": 27, "skills": [ "mongodb", "python"] },
{ "name": "Choi", "age": 22, "score": 10 }]
);

2. 입력된 모든 사원들의 document를 검색하세요

==>  db.people.find();

3. name 이 'Jung' 정보를 삭제하세요
==> db.people.deleteOne({"name":'Jung'});

4. 사원중 
   이름이 Lee 인 document를 
    - 이름  : Lim  , age : 25 변경하세요
==>  db.people.updateOne({"name":"Lee"},{$set:{"name":"Lee","age":25}});

5.이름이 Kim인 문서의 나이를 20을 변경하세요
==>  db.people.updateOne({"name":"kim"},{$set:{"age":20}});

6. 이름이 Park 인 문서에서 기술필드(skills)를 제거합니다. 
==>  db.people.deleteOne({"name":"Park"});

///
7. 이름이 Choi 인 문서에서 점수(score)필드를 2만큼 줄입니다.
==>  
db.people.updateOne(
{"name":"Choi"},
{$inc:{"score":-2}}
);




testdb1에 score컬렉션 생성 
({name:"Kim junsung",kor:90,eng:71,mat:88})
({name:"Lee jiyeon",kor:80,eng:87,mat:78})
({name:"Park heji",kor:60,eng:80,mat:58})
({name:"Kim yura",kor:89,eng:83,mat:75})
({name:"Choi jinsu",kor:54,eng:91,mat:68})
({name:"Lee jisun",kor:95,eng:88,mat:98})

==>
db.score.insertMany([{name:"Kim junsung",kor:90,eng:71,mat:88},{name:"Lee jiyeon",kor:80,eng:87,mat:78}]);
db.score.insertMany([{name:"Park heji",kor:60,eng:80,mat:58},{name:"Kim yura",kor:89,eng:83,mat:75},{name:"Choi jinsu",kor:54,eng:91,mat:68},{name:"Lee jisun",kor:95,eng:88,mat:98}]);


1. score전체 출력 해보세요 
==> db.score.find()
2. 이름과 수학 점수만 출력
==> db.score.find({},{_id:0,name:1,mat:1})

3. 수학 점수 중 70점 이상만 출력
=>  db.score.find({"mat":{$gte:70}},{_id:0,name:1,mat:1})

4. 이름과 국어를 출력하되, 국어 점수가 80점 이상 문서만 출력
=>  db.score.find({"kor":{$gte:80}},{_id:0,name:1,kor:1})


5. 이름이 'L' 로 시작되는 문서 출력

=>  db.score.find({ "name": { $regex: /^L/ }});
=>  db.score.find({ "name": /^L/});


================================================ 까지  풀기 


6. 이름을 출력하되 중복되지 않도록 
7. 영어 점수가 80점 이상인 학생의 이름 (distinct 함수이용)
8. 영어 점수가 가장 높은 문서 출력
9. 국어 점수가 가장 낮은 문서 출력
10. 5개 문서중 2개를 건너 뛰고 3줄 출력
11. 총 5개 문서중 2개를 건너 뛰고 3줄을 출력하되, 수학점수를 내림차순으로 출력
12. 이름과 수학의 점수를 출력하뒤, 수학 70점 이상의 총점 출력
    수학과목을 그룹핑 해서 총점 구하세요
13. 이름과 수학의 점수를 출력하되, 수학 70점 이상의 평균을 출력. 조건) 수학과목으로 그룹핑해서 평균구하기
14. 수학과 국어 두개의 점수가 모두 70점을 넘는 점수를 추출하여 두 점수의 합 구하기
15. 국어, 수학, 영어의 각각 과목별 합을 구하고 총합을 구하라
16. 영어 점수를 출력하되 영어점수의 합을 구하라 
  

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!