50 몽고디비에서 NoSQL 사용하기
예제1. 부서번호가 10번인 사원들의 사원번호, 이름, 월급을 조회하시오.
sql >
select ename, sal
from emp
where deptno = 10;
mongo >
db.emp.find({deptno:{$eq:10} },
{_id:0,empno:1,ename:1,sal:1} )
{ "empno" : 7782, "ename" : "CLARK", "sal" : 2450 }
{ "empno" : 7839, "ename" : "KING", "sal" : 5000 }
db.테이블명.find( { 검색조건 } , {출력 하고싶은 컬럼} )
검색조건 => 컬럼명 : {연산자:값}
출력 하고싶은 컬럼명 => 컬럼명:1
(_id는 항상 출력되기 때문에 안나오게 0을 줘야함)
ㅇ 몽고디비에서 사용하는 연산자
1. 비교연산자
몽고디비 | 파이썬 |
$eq | == |
$gt | > |
$gte | >= |
$lt | < |
$lte | <= |
$ne | != |
2. 논리연산자
몽고디비 | 파이썬 |
$and | and |
$not | ~ |
$or | or |
3. 산술연산자
몽고디비 | 파이썬 |
$add | + |
$substract | - |
$multiply | * |
$devide | / |
$mod | % |
문제316. 월급이 3000 이하인 사원들의 이름, 월급을 출력하시오.
sql>
select ename, sal
from emp
where sal <= 3000;
mongo>
db.emp.find( {sal: {$lte:3000} },
{_id:0,ename:1,sal:1} )
{ "ename" : "SMITH", "sal" : 1800 }
{ "ename" : "ALLEN", "sal" : 1600 }
{ "ename" : "WARD", "sal" : 1250 }
{ "ename" : "JONES", "sal" : 2975 }
{ "ename" : "MARTIN", "sal" : 1250 }
{ "ename" : "BLAKE", "sal" : 2850 }
{ "ename" : "CLARK", "sal" : 2450 }
{ "ename" : "SCOTT", "sal" : 3000 }
{ "ename" : "TURNER", "sal" : 1500 }
{ "ename" : "ADAMS", "sal" : 1100 }
{ "ename" : "JAMES", "sal" : 950 }
{ "ename" : "MILLER", "sal" : 1300 }
문제317. 직업이 SALESMAN인 사원들의 이름과 직업을 출력하시오.
sql >
select ename, job
from emp
where job = 'SALESMAN';
mongo
db.emp.find( {job:{$eq:'SALESMAN'} },
{_id:0,ename:1,job:1} )
{ "ename" : "ALLEN", "job" : "SALESMAN" }
{ "ename" : "WARD", "job" : "SALESMAN" }
{ "ename" : "MARTIN", "job" : "SALESMAN" }
{ "ename" : "TURNER", "job" : "SALESMAN" }
문제318. 직업이 SALESMAN이 아닌 사원들의 이름과 직업을 출력하시오.
sql >
select ename, job
from emp
where job != 'SALESMAN';
mongo>
db.emp.find( {job:{$ne:'SALEMSMAN'} },
{_id:0,ename:1,job:1} )
{ "ename" : "SMITH", "job" : "CLERK" }
{ "ename" : "ALLEN", "job" : "SALESMAN" }
{ "ename" : "WARD", "job" : "SALESMAN" }
{ "ename" : "JONES", "job" : "MANAGER" }
{ "ename" : "MARTIN", "job" : "SALESMAN" }
{ "ename" : "BLAKE", "job" : "MANAGER" }
{ "ename" : "CLARK", "job" : "MANAGER" }
{ "ename" : "SCOTT", "job" : "ANALYST" }
{ "ename" : "KING", "job" : "PRESIDENT" }
{ "ename" : "TURNER", "job" : "SALESMAN" }
{ "ename" : "ADAMS", "job" : "CLERK" }
{ "ename" : "JAMES", "job" : "CLERK" }
{ "ename" : "FORD", "job" : "ANALYST" }
{ "ename" : "MILLER", "job" : "CLERK" }
NoSQL은 NotOnly SQL의 약자로 SQL만이 데이터를 검색할 수 있는 것이 아니다라는 뜻입니다. SQL과는 다른 언어로 데이터를 검색합니다.
문제319. 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하시오.
sql>
select ename, sal
from emp
order by sal desc;
mongo>
db.emp.find( {},
{_id:0,ename:1,sal:1} ).sort({sal:-1})
{ "ename" : "KING", "sal" : 5000 }
{ "ename" : "FORD", "sal" : 3500 }
{ "ename" : "SCOTT", "sal" : 3000 }
{ "ename" : "JONES", "sal" : 2975 }
{ "ename" : "BLAKE", "sal" : 2850 }
{ "ename" : "CLARK", "sal" : 2450 }
{ "ename" : "SMITH", "sal" : 1800 }
{ "ename" : "ALLEN", "sal" : 1600 }
{ "ename" : "TURNER", "sal" : 1500 }
{ "ename" : "MILLER", "sal" : 1300 }
{ "ename" : "WARD", "sal" : 1250 }
{ "ename" : "MARTIN", "sal" : 1250 }
{ "ename" : "ADAMS", "sal" : 1100 }
{ "ename" : "JAMES", "sal" : 950 }
검색조건이 없으면 빈 중괄호로 놔두면 되고, 정렬을 할때는 sort({sal:-1}) 을 붙여주면 됨.
sort({정렬할컬럼: 1(asc정렬) 또는 -1(desc정렬)})
문제320. 직업이 SALESMAN인 사원들의 이름과 월급과 직업을 출력하는데 월급이 낮은 사원부터 출력하시오.
sql>
select ename, sal, job
from emp
where job ='SALESMAN'
order by sal asc;
mongo>
db.emp.find( {job:{$eq:'SALESMAN'}},
{_id:0,ename:1,sal:1,job:1} ).sort({sal:1})
{ "ename" : "WARD", "job" : "SALESMAN", "sal" : 1250 }
{ "ename" : "MARTIN", "job" : "SALESMAN", "sal" : 1250 }
{ "ename" : "TURNER", "job" : "SALESMAN", "sal" : 1500 }
{ "ename" : "ALLEN", "job" : "SALESMAN", "sal" : 1600 }
문제321. 월급이 1000에서 3000 사이인 사원들의 이름, 월급을 출력하시오.
sql>
select ename, sal
from emp
where sal between 1000 and 3000;
mongo>
db.emp.find( {sal:{$gte:1000,$lte:3000}},
{_id:0,ename:1,sal:1} )
{ "ename" : "SMITH", "sal" : 1800 }
{ "ename" : "ALLEN", "sal" : 1600 }
{ "ename" : "WARD", "sal" : 1250 }
{ "ename" : "JONES", "sal" : 2975 }
{ "ename" : "MARTIN", "sal" : 1250 }
{ "ename" : "BLAKE", "sal" : 2850 }
{ "ename" : "CLARK", "sal" : 2450 }
{ "ename" : "SCOTT", "sal" : 3000 }
{ "ename" : "TURNER", "sal" : 1500 }
{ "ename" : "ADAMS", "sal" : 1100 }
{ "ename" : "MILLER", "sal" : 1300 }
문제322. 위의 결과를 $and 연산자를 쓴 문법으로 수행하시오.
mongo>
db.emp.find( {$and:[{sal:{$gte:1000} },{sal:{$lte:3000} }] },
{_id:0,ename:1,sal:1} )
문제323. 월급이 1000에서 3000 사이가 아닌 사원들의 이름과 월급을 출력하시오.
sql>
select ename, sal
from emp
where sal < 1000 or sal > 3000;
mongo>
db.emp.find( {$or:[{sal:{$gt:3000}}, {sal:{$lt:1000}}] },
{_id:0,ename:1,sal:1} )
db.emp.find( {$and:[{sal:{$gte:1000} },{sal:{$lte:3000} }] },
{_id:0,ename:1,sal:1} )
문제324. 위의 결과를 다시 출력하는데 월급이 높은 사원부터 출력하시오.
sql>
select ename, sal
from emp
where sal < 1000 or sal > 3000
order by sal desc;
mongo>
db.emp.find( {$or:[{sal:{$gt:3000}}, {sal:{$lt:1000}}] },
{_id:0,ename:1,sal:1} ).sort({sal:-1})
{ "ename" : "KING", "sal" : 5000 }
{ "ename" : "FORD", "sal" : 3500 }
{ "ename" : "JAMES", "sal" : 950 }
문제325. 직업이 SALESMAN, ANALYST인 사원들의 이름, 월급, 직업을 출력하는데 월급이 높은 사원부터 출력하시오.
sql>
select ename, sal, job
from emp
where job ='SALESMAN' or jo 'ANALYST'
order by sal desc;
select ename, sal, job
from emp
where job in ('SALESMAN','ANALYST')
order by sal desc;
mongo>
db.emp.find(
{$or:[{job:{$eq:'SALESMAN'}},{job:{$eq:'ANALYST'}}] },
{_id:0,ename:1,sal:1,job:1}
).sort({sal:-1})
db.emp.find(
{job:{$in:['SALESMAN','ANALYST']}},
{_id:0,ename:1,sal:1,job:1}
).sort({sal:-1})
{ "ename" : "FORD", "job" : "ANALYST", "sal" : 3500 }
{ "ename" : "SCOTT", "job" : "ANALYST", "sal" : 3000 }
{ "ename" : "ALLEN", "job" : "SALESMAN", "sal" : 1600 }
{ "ename" : "TURNER", "job" : "SALESMAN", "sal" : 1500 }
{ "ename" : "WARD", "job" : "SALESMAN", "sal" : 1250 }
{ "ename" : "MARTIN", "job" : "SALESMAN", "sal" : 1250 }
몽고디비 | 오라클 |
$in | in |
$nin | not in |
문제326. 부서번호가 10번, 20번이 아닌 사원들의 이름, 월급, 부서번호를 출력하시오.
sql>
select ename, sal, deptno
from emp
where deptno not in (10,20);
mongo>
db.emp.find(
{deptno:{$nin:[10,20]}},
{_id:0,ename:1,sal:1,deptno:1} )
{ "ename" : "WARD", "sal" : 1250, "deptno" : 30 }
{ "ename" : "MARTIN", "sal" : 1250, "deptno" : 30 }
{ "ename" : "BLAKE", "sal" : 2850, "deptno" : 30 }
{ "ename" : "TURNER", "sal" : 1500, "deptno" : 30 }
{ "ename" : "JAMES", "sal" : 950, "deptno" : 30 }
문제327. 부서번호를 출력하는데 중복제거해서 출력하시오.
sql>
select distinct deptno
from emp;
mongo>
db.emp.distinct("deptno")
[ 20, 30, 10 ]
문제328. 직업을 출력하는데 중복을 제거해서 출력하시오.
mongo>
db.emp.distinct("job")
[ "CLERK", "SALESMAN", "MANAGER", "ANALYST", "PRESIDENT" ]
문제329. 사원 테이블의 전체 건수를 출력하시오.
sql>
select count(*)
from emp;
mongo>
db.emp.count()
14
문제330. 직업이 SALESMAN인 사원들의 인원수를 출력하시오.
sql>
select count(*)
from emp
where job = 'SALESMAN';
mongo>
db.emp.count( {job:{$eq:'SALESMAN'}} )
4
문제331. 직업이 SALESMAN이 아닌 사원들의 인원수를 출력하시오.
sql>
select count(*)
from emp
where job != 'SALESMAN';
mongo>
db.emp.count( {job:{$ne:'SALESMAN'}} )
10
51 csv 파일을 mongodb 로 로드하는 방법
예제1. /home/oracle 밑에 dept.csv가 있는지 확인하시오.
[root@centos ~]# ls -l /home/oracle/dept.csv
-rw-rw-r--. 1 oracle oracle 84 3월 28 14:28 /home/oracle/dept.csv
[root@centos ~]# cat /home/oracle/dept.csv
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
예제2. dept.csv에 맨 위에 컬럼명을 vi편집기 명령어로 넣고 저장하시오.
[root@centos ~]# vi /home/oracle/dept.csv
[root@centos ~]# cat /home/oracle/dept.csv
deptno,dname,loc
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
예제3. dept.csv로 몽고디비에 dept테이블을 생성하시오.
> db.dept.find({},{_id:0})
{ "deptno" : 10, "dname" : "ACCOUNTING", "loc" : "NEW YORK" }
{ "deptno" : 20, "dname" : "RESEARCH", "loc" : "DALLAS" }
{ "deptno" : 30, "dname" : "SALES", "loc" : "CHICAGO" }
{ "deptno" : 40, "dname" : "OPERATIONS", "loc" : "BOSTON" }
예제4. 몽고디비에 만든 테이블 리스트를 확인하시오.
mongo>
show collections
dept
emp
예제5. emp테이블을 drop하시오.
mongo>
db.emp.drop()
true
> show collections
dept
예제6. /home/oracle 밑에 emp.csv가 있는지 확인하고 첫번째 행에 컬럼명이 있는지 확인하시오.
예제7. emp.csv 맨 위에 컬럼명을 추가하시오.
[root@centos ~]# vi /home/oracle/emp.csv
[root@centos ~]# cat /home/oracle/emp.csv
empno,ename,job,mgr,hiredate,sal,comm,deptno
7839,KING,PRESIDENT,,1981-11-17,5000,,10
7698,BLAKE,MANAGER,7839,1981-05-01,2850,,30
7782,CLARK,MANAGER,7839,1981-05-09,2450,,10
7566,JONES,MANAGER,7839,1981-04-01,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-10,1250,1400,30
7499,ALLEN,SALESMAN,7698,1981-02-11,1600,300,30
7844,TURNER,SALESMAN,7698,1981-08-21,1500,0,30
7900,JAMES,CLERK,7698,1981-12-11,950,,30
7521,WARD,SALESMAN,7698,1981-02-23,1250,500,30
7902,FORD,ANALYST,7566,1981-12-11,3000,,20
7369,SMITH,CLERK,7902,1980-12-09,800,,20
7788,SCOTT,ANALYST,7566,1982-12-22,3000,,20
7876,ADAMS,CLERK,7788,1983-01-15,1100,,20
7934,MILLER,CLERK,7782,1982-01-11,1300,,10
예제8. emp.csv로 emp테이블을 몽고디비에 생성하시오.
[root@centos ~]# mongoimport --type csv -c emp --headerline --drop /home/oracle/emp.csv
2022-03-29T14:57:54.967+0900 connected to: localhost
2022-03-29T14:57:54.967+0900 dropping: test.emp
2022-03-29T14:57:54.984+0900 imported 14 documents
mongo> db.emp.count()
14
52 하둡 분산 파일 시스템에 있는 csv 파일을 몽고디비로 임폴트 하는 방법
몽도디비는 root에서 설치했고 하둡은 oracle에서 설치했습니다. 하둡과 몽고디비를 같이 사용하려면 oracle로 접속해서 몽고디비로 접속을 해야합니다.
[root@centos ~]# su - oracle
(base) [oracle@centos ~]$ mongo
예제1. /home/oracle 밑에 emp.csv로 복사하시오.
(base) [oracle@centos ~]$ cp emp.csv emp700.csv
(base) [oracle@centos ~]$ head -2 emp700.csv
empno,ename,job,mgr,hiredate,sal,comm,deptno
7839,KING,PRESIDENT,,1981-11-17,5000,,10
예제2. jps명령어를 수행해서 하둡 분산 파일 시스템이 정상인지 확인합니다.
(base) [oracle@centos ~]$ jps
2676 JobTracker
31157 Jps
2585 SecondaryNameNode
2827 TaskTracker
2427 DataNode
2272 NameNode
예제3. emp700.csv를 하둡분산파일시스템 /user/oracle/emp700.csv로 올리시오.
(base) [oracle@centos ~]$ hadoop fs -put emp700.csv /user/oracle/emp700.csv
(base) [oracle@centos ~]$ hadoop fs -lsr /user/oracle/emp700.csv
-rw-r--r-- 3 oracle supergroup 679 2022-03-29 15:11 /user/oracle/emp700.csv
예제4. 하둡 분산 파일 시스템에 올린 /user/oracle/emp700.csv를 mongodb에 emp700으로 생성하시오.
(base) [oracle@centos ~]$ hadoop fs -text /user/oracle/emp700.csv | mongoimport --type csv -c emp700 --headerline --drop
2022-03-29T15:28:40.837+0900 connected to: localhost
2022-03-29T15:28:40.837+0900 dropping: test.emp700
2022-03-29T15:28:40.943+0900 imported 14 documents
(base) [oracle@centos ~]$ mongo
> show collections
dept
emp
emp700
> db.emp700.count()
14
예제5. emp700에서 이름과 월급을 출력하시오.
> db.emp700.find({},{_id:0,ename:1,sal:1})
{ "ename" : "KING", "sal" : 5000 }
{ "ename" : "BLAKE", "sal" : 2850 }
{ "ename" : "CLARK", "sal" : 2450 }
{ "ename" : "JONES", "sal" : 2975 }
{ "ename" : "MARTIN", "sal" : 1250 }
{ "ename" : "ALLEN", "sal" : 1600 }
{ "ename" : "TURNER", "sal" : 1500 }
{ "ename" : "JAMES", "sal" : 950 }
{ "ename" : "WARD", "sal" : 1250 }
{ "ename" : "FORD", "sal" : 3000 }
{ "ename" : "SMITH", "sal" : 800 }
{ "ename" : "SCOTT", "sal" : 3000 }
{ "ename" : "ADAMS", "sal" : 1100 }
{ "ename" : "MILLER", "sal" : 1300 }
하둡에서 NoSQL을 사용하는 궁극적인 목적은 대용량 데이터에서 우리가 원하는 데이터만 검색해서 그 결과를 따로 csv파일로 내리기 위해서.
예제6. 월급이 3000 이하인 사람들의 이름, 월급을 조회하시오.
mongo>
db.emp700.find({sal:{$lte:3000}}, {_id:0,ename:1,sal:1} )
{ "ename" : "BLAKE", "sal" : 2850 }
{ "ename" : "CLARK", "sal" : 2450 }
{ "ename" : "JONES", "sal" : 2975 }
{ "ename" : "MARTIN", "sal" : 1250 }
{ "ename" : "ALLEN", "sal" : 1600 }
{ "ename" : "TURNER", "sal" : 1500 }
{ "ename" : "JAMES", "sal" : 950 }
{ "ename" : "WARD", "sal" : 1250 }
{ "ename" : "FORD", "sal" : 3000 }
{ "ename" : "SMITH", "sal" : 800 }
{ "ename" : "SCOTT", "sal" : 3000 }
{ "ename" : "ADAMS", "sal" : 1100 }
{ "ename" : "MILLER", "sal" : 1300 }
예제7. 위의 결과를 result700.csv로 내리시오.
(base) [oracle@centos ~]$ mongoexport --db=test --collection=emp700 --type=csv --query '{sal : {$lte : 3000} }' \
> --fields=ename,sal --out=result700.csv
2022-03-29T15:53:14.648+0900 connected to: localhost
2022-03-29T15:53:14.649+0900 exported 13 records
(base) [oracle@centos ~]$ cat result700.csv
ename,sal
BLAKE,2850
CLARK,2450
JONES,2975
MARTIN,1250
ALLEN,1600
TURNER,1500
JAMES,950
WARD,1250
FORD,3000
SMITH,800
SCOTT,3000
ADAMS,1100
MILLER,1300
예제8. 부서번호가 20번인 사원들의 데이터를 dept20.csv로 생성하시오.
(base) [oracle@centos ~]$ mongoexport --db=test --collection=emp700 --type=csv --query '{deptno :{$eq:20} }' --fields=empno,ename,sal,mgr,hiredate,comm,job,de ptno --out=dept20.csv
2022-03-29T15:58:27.409+0900 connected to: localhost
2022-03-29T15:58:27.409+0900 exported 5 records
(base) [oracle@centos ~]$ cat dept20.csv
empno,ename,sal,mgr,hiredate,comm,job,deptno
7566,JONES,2975,7839,1981-04-01,,MANAGER,20
7902,FORD,3000,7566,1981-12-11,,ANALYST,20
7369,SMITH,800,7902,1980-12-09,,CLERK,20
7788,SCOTT,3000,7566,1982-12-22,,ANALYST,20
7876,ADAMS,1100,7788,1983-01-15,,CLERK,20
53 몽고디비에서 그룹함수 사용하기
예제1. 사원 테이블의 토탈월급을 출력하시오.
SQL>
select sum(sal)
from emp;
mongo>
db.emp.aggregate( [ {$group:{_id:0, total:{$sum:'$sal'}} } ])
{ "_id" : 0, "total" : 29025 }
예제2. 사원 테이블의 최소 월급을 출력하시오.
sql>
select min(sal)
from emp;
mongo>
db.emp.aggregate( [ {$group: {_id:0,minsal:{$min:'$sal'}} } ])
{ "_id" : 0, "minsal" : 800 }
예제3. 직업이 SALESMAN인 사원들의 최대월급을 출력하시오.
SQL>
select max(sal)
from emp
where job='SALESMAN';
mongo>
db.emp.aggregate([ {$match: {job:'SALESMAN'}}, {$group:{_id:0,maxsal:{$max:'$sal'}} } ])
예제4. 부서번호가 30번인 사원들의 최소월급을 출력하시오.
sql>
select min(sal)
from emp
where deptno=30;
mongo>
db.emp.aggregate([ {$match: {deptno:30}}, {$group:{_id:0,minsal:{$min:'$sal'}} } ])
{ "_id" : 0, "minsal" : 950 }
예제5. 부서번호, 부서번호별 토탈월급을 출력하시오.
sql>
select deptno, sum(sal)
from emp
group by deptno;
mongo>
db.emp.aggregate([ {$group:{_id:'$deptno',total:{$sum:'$sal'} } } ])
{ "_id" : 20, "total" : 10875 }
{ "_id" : 30, "total" : 9400 }
{ "_id" : 10, "total" : 8750 }
예제6. 직업, 직업별 토탈월급을 출력하시오.
sql>
select job, sum(sal)
from emp
group by job;
mongo>
db.emp.aggregate([ {$group:{_id:'$job',total:{$sum:'$sal'} } } ])
{ "_id" : "PRESIDENT", "total" : 5000 }
{ "_id" : "MANAGER", "total" : 8275 }
{ "_id" : "SALESMAN", "total" : 5600 }
{ "_id" : "ANALYST", "total" : 6000 }
{ "_id" : "CLERK", "total" : 4150 }
예제7. 위의 결과를 다시 출력하는데 토탈월급이 높은 것부터 출력하시오.
sql>
select job, sum(sal)
from emp
group by job
order by sum(sal) desc;
mongo>
db.emp.aggregate([ {$group:{_id:'$job',total:{$sum:'$sal'} }},
{$sort:{"total":-1} } ])
{ "_id" : "MANAGER", "total" : 8275 }
{ "_id" : "ANALYST", "total" : 6000 }
{ "_id" : "SALESMAN", "total" : 5600 }
{ "_id" : "PRESIDENT", "total" : 5000 }
{ "_id" : "CLERK", "total" : 4150 }
예제8. 위의 결과를 다시 출력하는데 이번에는 job을 abcd순으로 정렬해서 출력하시오.
mongo>
db.emp.aggregate([ {$group:{_id:'$job',total:{$sum:'$sal'} }},
{$sort:{"_id":1} } ])
{ "_id" : "ANALYST", "total" : 6000 }
{ "_id" : "CLERK", "total" : 4150 }
{ "_id" : "MANAGER", "total" : 8275 }
{ "_id" : "PRESIDENT", "total" : 5000 }
{ "_id" : "SALESMAN", "total" : 5600 }
예제9. 부서번호, 부서번호별 평균월급을 출력하는데 평균월급이 낮은것부터 높은순으로 출력하시오.
sql>
select deptno, avg(sal)
from emp
group by deptno
order by avg(sal) asc;
mongo>
db.emp.aggregate([ {$group:{_id:'$deptno',avgsal:{$avg:'$sal'} }},
{$sort:{"avgsal":1} } ])
{ "_id" : 30, "avgsal" : 1566.6666666666667 }
{ "_id" : 20, "avgsal" : 2175 }
{ "_id" : 10, "avgsal" : 2916.6666666666665 }
예제10. 위의 결과를 다시 출력하는데 20번 부서번호는 제외하고 출력하시오.
mongo>
db.emp.aggregate([ {$match: {deptno:{$ne:20}} },
{$group:{_id:'$deptno',avgsal:{$avg:'$sal'} }},
{$sort:{"avgsal":1} } ])
{ "_id" : 30, "avgsal" : 1566.6666666666667 }
{ "_id" : 10, "avgsal" : 2916.6666666666665 }
+) 몽고디비에서 컬럼명 확인하는 방법
> db.emp.findOne()
{
"_id" : ObjectId("62429fe24f39427ba8d9cada"),
"empno" : 7839,
"ename" : "KING",
"job" : "PRESIDENT",
"mgr" : "",
"hiredate" : "1981-11-17",
"sal" : 5000,
"comm" : "",
"deptno" : 10
}
몽고디비에서는 컬럼명 작성할 때 대소문자 구분됨.
문제332. 아래의 두 문제중 하나를 선택해서 답글로 올려주세요.
1. emp로 만든 문제
직업, 직업별 토탈월급을 출력하는데 직업이 SALESMAN은 제외하고 출력하고, 직업별 토탈월급이 높은 것부터 출력하시오.
> db.emp.aggregate([ {$match: {job:{$ne:'SALESMAN'}} },
{$group:{_id:'$job',sumsal:{$sum:'$sal'} }},
{$sort:{"sumsal":-1} } ])
{ "_id" : "MANAGER", "sumsal" : 8275 }
{ "_id" : "ANALYST", "sumsal" : 6000 }
{ "_id" : "PRESIDENT", "sumsal" : 5000 }
{ "_id" : "CLERK", "sumsal" : 4150 }
2. 항공기로 만든 문제
예제1. /home/oracle 밑에 있는 1994.csv를 몽고디비에 airline이라는 테이블로 구성하시오.
(base) [oracle@centos ~]$ head -1 1994.csv | awk '{print $0}'
Year,Month,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime,UniqueCarrier,FlightNum,TailNum,ActualElapsedTime,CRSElapsedTime,AirTime,ArrDelay,DepDelay,Origin,Dest,Distance,TaxiIn,TaxiOut,Cancelled,CancellationCode,Diverted,CarrierDelay,WeatherDelay,NASDelay,SecurityDelay,LateAircraftDelay
(base) [oracle@centos ~]$ head -1 1994.csv | awk '{print tolower($0)}'
year,month,dayofmonth,dayofweek,deptime,crsdeptime,arrtime,crsarrtime,uniquecarrier,flightnum,tailnum,actualelapsedtime,crselapsedtime,airtime,arrdelay,depdelay,origin,dest,distance,taxiin,taxiout,cancelled,cancellationcode,diverted,carrierdelay,weatherdelay,nasdelay,securitydelay,lateaircraftdelay
(base) [oracle@centos ~]$ vi 1994.csv
(base) [oracle@centos ~]$ mongoimport --type csv -c airline --headerline --drop /home/oracle/1994.csv
컬럼명 소문자로 vi편집기에서 편집한 다음에 몽고디비에 임포트함.
sql>
select month, count(depdelay)
from airline
where depdelay > 0
group by month;
> db.airline.aggregate([ {$match:{depdelay:{$gt:0}} },
... {$group:{'_id':"$month", count:{$sum:1}}},
... {$sort:{"count":-1} } ])
{ "_id" : 12, "count" : 240057 }
{ "_id" : 7, "count" : 222409 }
{ "_id" : 1, "count" : 215791 }
{ "_id" : 11, "count" : 213819 }
{ "_id" : 8, "count" : 207187 }
{ "_id" : 6, "count" : 201658 }
{ "_id" : 3, "count" : 195139 }
{ "_id" : 10, "count" : 190085 }
{ "_id" : 2, "count" : 184811 }
{ "_id" : 4, "count" : 181870 }
{ "_id" : 5, "count" : 170538 }
{ "_id" : 9, "count" : 170182 }
'Study > class note' 카테고리의 다른 글
하둡 / 몽고디비 GUI 툴 사용하기 (0) | 2022.03.30 |
---|---|
하둡 / 몽고디비 설치 (0) | 2022.03.29 |
하둡 / 하이브 파티션 테이블 2 (0) | 2022.03.29 |
하둡 / 하둡 파일 시스템에 하이브에서 파티션 테이블 생성하기 (0) | 2022.03.28 |
하둡 / 스파크에서 스파크 SQL 사용하기 (0) | 2022.03.28 |