ch0nny_log

[빅데이터분석] Linux_6. 몽고 디비(mongo db) 설치 및 운영관리 본문

빅데이터 분석(with 아이티윌)/리눅스

[빅데이터분석] Linux_6. 몽고 디비(mongo db) 설치 및 운영관리

chonny 2024. 9. 24. 16:19

■ centos 에 mongo db 설치 

1. root 유져로 접속합니다.

2. 몽고 디비를 설치하기 위하여 아래의 파일을 열어서 아래의 내용을 입력합니다.

 

[root@centos ~]# vi /etc/yum.repos.d/mongodb-org-3.4.repo
 

3. 몽고디비를 설치합니다.

[root@centos ~]# yum install -y mongodb-org



4. 몽고디비를 시작 시킵니다.

[root@centos ~]#  systemctl enable mongod 

[root@centos ~]#  systemctl start mongod


5. 몽고디비를 실행합니다.

[root@centos ~]# mongo



6. mongodb 에 emp 테이블을 생성합니다.

db.emp.save({empno:7499,ename:"SMITH",job:"CLERK",mgr:7902,hiredate:"1980-12-17",sal:1800,comm:800,deptno:20})
db.emp.save({empno:7369,ename:"ALLEN",job:"SALESMAN",mgr:7698,hiredate:"1981-02-20",sal:1600,comm:800,deptno:20})
db.emp.save({empno:7521,ename:"WARD",job:"SALESMAN",mgr:7698,hiredate:"1981-02-22",sal:1250,comm:500,deptno:30})
db.emp.save({empno:7566,ename:"JONES",job:"MANAGER",mgr:7839, hiredate:"1981-04-02",sal:2975,comm:0,deptno:20})
db.emp.save({empno:7654,ename:"MARTIN",job:"SALESMAN",mgr:7698,hiredate:"1981-09-28",sal:1250,comm:1400,deptno:30})
db.emp.save({empno:7698,ename:"BLAKE",job:"MANAGER",mgr:7839,hiredate:"1981-05-01",sal:2850,comm:0,deptno:30})
db.emp.save({empno:7782,ename:"CLARK",job:"MANAGER",mgr:7839,hiredate:"1981-06-09",sal:2450,comm:0,deptno:10})
db.emp.save({empno:7788,ename:"SCOTT",job:"ANALYST",mgr:7566,hiredate:"1987-04-19",sal:3000,comm:0,deptno:20})
db.emp.save({empno:7839,ename:"KING",job:"PRESIDENT",mgr:0,hiredate:"1981-11-17",sal:5000,comm:0,deptno:10})
db.emp.save({empno:7844,ename:"TURNER",job:"SALESMAN",mgr:7698,hiredate:"1981-09-08",sal:1500,comm:0,deptno:30})
db.emp.save({empno:7876,ename:"ADAMS",job:"CLERK",mgr:7788,hiredate:"1987-05-23",sal:1100, comm:0,deptno:20})
db.emp.save({empno:7900,ename:"JAMES",job:"CLERK",mgr:7698,hiredate:"1981-12-03",sal:950,comm:0,deptno:30})
db.emp.save({empno:7902,ename:"FORD",job:"ANALYST",mgr:7566,hiredate:"1981-12-03",sal:3500,comm:0,deptno:20})
db.emp.save({empno:7934,ename:"MILLER",job:"CLERK",mgr:7782,hiredate:"1982-01-23",sal:1300, comm:0,deptno:20})




7. emp 데이터를 count 합니다. 

 

 

 

※ 몽고 디비를 편하게 사용할 수 있는 툴 설치하기

참고 링크

 

Daum 카페

 

cafe.daum.net



 

※ mongo DB 란? 

mongo 와 db와의 합성어입니다.

mongo 의 뜻이 거대한(Humongous)의 줄임말

 

■ 하둡 생태계

 

hive, mongodb, pig, spark
하둡 hdfs 와 mapreduce

 


■ 몽고디비 문법

db.테이블명.find(
				{검색조건}.
			    {보고싶은 컬럼명 })

 


■ 몽고디비 연산자 총정리 

  몽고디비  SQL
1. 비교 연산자  $eq =
$gt >
$gte >=
$lte <
$ne <=
$lte  !=
2. 논리 연산자 $and and
$or or
$not not
3. 산술 연산자  $add  +
$substract   -
$multiply  *
$devide /
$mod     mod

 




■ 몽고디비에서 데이터 검색하기 

예제1. 월급이 3000 이하인 사원들의 이름과 월급을 출력하시오 !
db.emp.find( {job: {$nin : ['SALESMAN','ANALYST']}},
               {_id:0 , ename:1, sal:1, job:1}
               )

 

문제1. 직업이salesman인 사원들의 이름,직업을 출력하시오.
db.emp.find(   {job : {$eq:'SALESMAN'}},
                 { _id: 0, ename:1, job:1})​
문제2. 직업이 salesman이 아닌사원들의 이름,직업을 출력하시오,
                
db.emp.find(   {job : {$ne:'SALESMAN'}},
                 { _id: 0, ename:1, job:1})​

 


 

■ 몽고디비 연산자 총정리 

 SQL 몽고디비
1. between  .. and $gte
2.  in
$in / $nin
3.  like /찾고자하는 문자/ 
       시작은 ^, 끝은 $
4. is null  

 

예제1. 월급이1000에서 3000사이인 사원들의 이름,월급을  출력하시오.
db.emp.find(   {sal : {$gte:1000, $lte:3000}},
                 { _id: 0, ename:1, sal:1})​
예제2. 직업이 SALESMAN, ANAYST 인 사원들의 이름과 월급을 출력하시오.
db.emp.find(   {job : {$in:['SALESMAN','ANAYLST']}},
                 { _id: 0, ename:1, sal:1, job:1})​
문제1. 부서번호가 10, 20번인 사원들의 이름, 월급, 부서번호를 출력하시오.
db.emp.find(   {deptno : {$in:[10,20]}},
                 { _id: 0, ename:1, sal:1, deptno:1})​

 

 

문제2. 부서번호가 10번, 20번이 아닌 사원들의 이름과 월급과 직업을 출력하시오! 
db.emp.find(  
                  {  deptno : { $nin : [ 10, 20 ] } },
                  { _id : 0 , ename : 1, sal : 1, job : 1 }
                )​
문제3. 이름의 첫번째 철자가 S 로 시작하는 사원들의 이름과 월급을 출력하시오 !
db.emp.find(  
                 {  ename  :  /^S/ },
                 { _id : 0,  ename : 1, sal : 1 }
               )​

설명:  /찾고자하는 문자/ 
       시작은 ^, 끝은 $
       ^S 는 S 로 시작하는것이고 S$ 는 S로 끝나는 것입니다.

문제4. 이름의 끝 글자가 T로 끝나는 사원들의 이름과 월금을 출력하시오.
db.emp.find(   {ename: /T$/},
                 { _id: 0, ename:1, sal:1})​
문제5. 이름에 m자를 포함하고 있는 사원들의 이름, 월급을  출력하시오
db.emp.find(   {ename: /M/},
                 { _id: 0, ename:1, sal:1})​
문제6. emp테이블을 drop 하시오
dm.emp.drop()​

 

문제7. emp.csv로 몽고디비에 emp테이블을 생성하시오
[root@centos ~]# cat emp.csv | mongoimport --type csv -c emp --headerline --drop​

db.emp.find()​

 

 

 

문제8. 1996.csv를 리눅스 서버에 올리고 몽고디비의 테이블(collection)으로 생성하시오) _테이블명_ airline

cat  /root/1996.csv  | mongoimport  --type  csv  -c  airline  --headerline  --drop​

db.airline.count()

 

문제9. 커미션이 null인 사원들의 이름과 커미션을 출력하시오
db.emp.find(    
                 { comm :  { $ne : null }  },
                 { _id : 0, ename :1, comm : 1 }
               )​

 

 


 

■ 몽고디비에서 데이터 정렬

문제1. 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하시오
db.emp.find(   {   } ,
                   {  _id : 0, ename : 1, sal : 1 }
               ).sort( {sal : -1} )​
1 은 ascending 이고 -1 은 descending 임
문제2. 직업이 SALESMAN 인 사원들의 이름과 월급을 출력하는데 월급이 낮은 사원부터 높은 사원순으로 출력하시오 
db.emp.find(   { job : { $eq : "ANALYST"}  } ,
                   {  _id : 0, ename : 1, sal : 1 }
               ).sort( {sal : -1} )​

 

■ 몽고디비에서 그룹함수 사용하기

문제1. 사원테이블에서 최대월급을 출력하시오.
db.emp.aggregate([{$group:{_id:0, 최대월급:{$max: "$sal"}}}])​
문제2. 사원테이블에서 최소월급을 출력하시오.
db.emp.aggregate([{$group:{_id:0, 최소월급:{$min: "$sal"}}}])​
문제3. 직업이 salesman 사원들 중에서 최소월급을 출력하시오
db.emp.aggregate([{$match:{ job:'CLERK'}},
                   {$group:{_id:0, 최소월급:{$min: "$sal"}}}])​
문제 4. 부서번호가 30번인 사원들의 토탈월급을 출력하시오.
db.emp.aggregate([{$match:{ deptno:30}},
                   {$group:{_id:0, 토탈월급:{$sum: "$sal"}}}])
문제5. 부서번호, 부서번호별 토탈월급을 출력하시오
db.emp.aggregate([
                   {$group:{_id:'$deptno', 토탈월급:{$sum: "$sal"}}}])​
문제6. 직업과 직업별 토탈월급을 출력하는데 직업별 토탈월급이 높은것 부터 출력하시오.
db.emp.aggregate(
                   {$group:{_id:'$job', 토탈월급:{$sum: "$sal"}}},
                   {$sort: {'토탈월급':-1}})​
문제7. 위의 결과를 다시 출력하는데 직업이 clerk은 제외하고 출력하시오
db.emp.aggregate( {$match:{job:{$ne:"CLERK"}}},
                   {$group:{_id:'$job', 토탈월급:{$sum: "$sal"}}},
                   {$sort: {'토탈월급':-1}})​
문제8. 미국 항공 데이터 airline 테이블에서 월, 월별 출발 지연의 평균값을 출력하는데 출발 지연의 평균값이 높은 것 부터 출력하시오
db.airline.aggregate(
                   {$group:{_id:'$Month', 평균지연:{$avg: "$DepDelay"}}},
                   {$sort: {'평균지연':-1}})​




 

■ 몽고디비에서 count  함수

1. 테이블 테이블
2. 이미지 몽고디비(무료)
몽고디비(무료) 몽고디비(무료)
4. 텍스트 감정분석, 자연어 처리 신경망 구성(쳇봇, 쳇GPT)
5. 웹로그 AB 테스트 결과 분석

 

문제1. 직업, 직업별 인원수를 출력하시오 !
db.emp.aggregate(  
                          { $group : { _id: "$job", 인원수: {$sum:1} } }
                       )​

※ 설명: 몽고디비는 SQL처럼 count 함수가 있는게 아니어서 sum 을 이용해야합니다.

문제2. 부서번호, 부서번호별 인원수를 출력하시오 !
db.emp.aggregate(  
                          { $group : { _id: "$deptno", 인원수: {$sum:1} } }
                       )​

 

문제3. 위의 결과를 다시 출력하는데 부서번호별 인원수가 높은것 부터 출력하시오 !
db.emp.aggregate(  
                          { $group : { _id: "$deptno", 인원수: {$sum:1} } },
                          { $sort : {"인원수" : -1 }  }
                       )​

 ※ 설명 : -1 은 높은것 부터, 1은 낮은것 부터 출력됩니다.

문제4. 5백만건이 넘는 미국 항공 데이터에서 1996년도의 미국 항공기의 이륙과 착륙건수에 대한 아래의 SQL을 몽고디비로 구현하시오 !
select  month, count(*)
  from  airline
  group   by month;

답:   
db.airline.aggregate( 
                                { $group : { _id:"$Month", 건수: {$sum:1} } }
                         )​

※ 설명: 컬럼명의 대소문자를 구분해야 됩니다. 

문제5.월별로 비행기 출발 지연이 높은 달이 언제인지 알기 위해서 아래의 SQL을 몽고디비로 구현하시오 ! 
select  Month, count(*)
  from  airline
  where  DepDelay > 0 
  group  by Month;

답:
db.airline.aggregate( 
                                { $match : { DepDelay : { $gt : 0 } } },
                                { $group : { _id:"$Month", 건수: {$sum:1} } }
                         )​
문제6.위의 결과에서 비행기 출발 지연에 대한 건수가 높은것 부터 출력하시오 !
select  Month, count(*)
  from  airline
  where  DepDelay > 0 
  group  by Month
  order  by  2  desc; 

답:

db.airline.aggregate( 
                                { $match : { DepDelay : { $gt : 0 } } },
                                { $group : { _id:"$Month", 건수: {$sum:1} } },
                                { $sort : {"건수" : -1 }  } 
                         )​

 


 

■ 몽고디비로 출력된 결과를 csv 파일로 내리기 

문제1. (팀장님의 요청) 문제27번의 결과를 csv 파일로 내리기 위해서 테이블로 생성합니다. 
db.airline.aggregate( 
                                { $match : { DepDelay : { $gt : 0 } } },
                                { $group : { _id:"$Month", 건수: {$sum:1} } },
                                { $sort : {"건수" : -1 }  } ,
                                { $out :  "airline_1996" }
                         )

db.airline_1996.find()​

 

 몽고디비에서 data update 하기 

 다른 NoSQL  과는 다르게 몽고디비는 데이터를 수정할 수 있습니다.

 NoSQL 이란 ?  

 

Not only SQL 의 약자로 SQL 만 가지고 데이터를 검색할 수 있는것은 아니다의 뜻입니다. 

문제1. 아래의 SQL 을 몽고디비로 구현하시오 !
update  emp
  set  sal = 9000
  where  ename='SCOTT';

db.emp.update(  
                     { ename : 'SCOTT' },
                     { $set : { sal : 9000 } },
                     { multi : true }
                    )

db.emp.find()​

설명:  몽고디비에서는 commit 이나 rollback 이 몽고디비 4.2 이상부터 지원됩니다.

문제2. 아래의 SQL을 몽고디비로 구현하시오 !
update  emp
 set  comm = 8000
 where  job='ANALYST';

db.emp.update(  
                     { job : 'ANALYST' },
                     { $set : { comm : 8000 } },
                     { multi : true }
                    )

db.emp.find()​
문제3. 아래의 SQL을 mongodb 로 구현하시오 !
delete  from   emp
 where  ename='SCOTT';

db.emp.deleteOne( { ename : 'SCOTT' } )
db.emp.find()​
문제4. 직업이 ANALYST 인 사원들을 지우시오 !
db.emp.deleteMany( { job : 'ANALYST' } )
db.emp.find()​

한개를 지울때는 deleteOne 을 쓰고 여러개를 지울때는 deleteMany 를 씁니다.

문제5. 아래의 insert 문장을 몽고디비로 구현하시오 !
insert  into  emp(empno, ename, sal, deptno)
values(1234,'aaa', 4000, 20);


db.emp.insertOne( {  
                         empno : 1234,
                         ename : 'aaa',
                         sal : 4000,
                         deptno : 20
                     } ) 

db.emp.find()​

 

문제6. dept.csv 를 몽고디비에 테이블로 구성하시오 !
# cat  /root/dept.csv   |  mongoimport  --type  csv  -c dept  --headerline --drop​
문제7. 아래의 SQL을 몽고디비로 구현하시오 !
insert  into  dept(deptno, loc, dname )
  values( 50, 'seoul', 'hr' );

db.dept.insertOne( {
                            deptno : 50,
                            loc : 'seoul',
                            dname : 'hr'
                         } );

db.dept.find()​

 


 

■ 몽고디비와 파이썬 연동

 

#1. 로컬에 윈도우의 주피터 노트북을 켭니다.

#2. 명령 프롬프트 창을 열고 리눅스 서버로 ping 이 나가는지 확인합니다.

C:\Users\ITWILL>ping 192.168.56.1

Ping 192.168.56.1 32바이트 데이터 사용:
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128

192.168.56.1에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 0ms, 평균 = 0ms

#3. 명령 프롬프트 창에서 ssh 로 리눅스 서버에 root  로 접속되는지 확인합니다.

C:\Users\ITWILL>ssh root@192.168.56.1
root@192.168.56.1's password:
Last login: Wed Sep 25 10:43:28 2024 from gateway
[root@centos ~]#
[root@centos ~]#

#4. 주피터 노트북에서 pymongo 를 설치합니다. 

pip  install  pymongo

#5.  putty 에서  몽고디비의 기본 포트인 27017이 활성화 되었는지 확인합니다.

# ps -ef | grep 27017

#6. 아래의 코드를 이용해서 몽고디비와 연동합니다.

from  pymongo   import  MongoClient

client = MongoClient('mongodb://192.168.56.1:27017/')

db = client['test']

collection = db['emp']

all_emp = collection.find()

import pandas  as  pd
df = pd.DataFrame( list(all_emp) )
df

 

 

--> 안되어서 넘어감