저널링은?
복제시스템을 가지고 있는 샤딩분산작업을 했을 때
파일시스템이 변경됐을 때(데이터를 수정했을 때)
저널링 파일시스템이란게 발생을 해서
커밋단계를 만들어준다.
몽고디비는
1. 기본이 네트워크 통신이다
2. 스트림단위가 필요없다 기본이 바이너리타입이라 그래서 통신이 원활하다
어떤 머신에 붙일 때 or 장거리로 보낼 때 유리
비정형, 대용량 데이터 통신에 너무 원활
어제 수업
1. 프로그램 설치
2. 특징확인
3. 상태확인
MR은 기본적으로 그룹핑하고 집계한 결과
================================================================
컬렉션 생성, 연산자 활용, 집계
//score 컬렉션 생성
db.score.insert( { name : "aaa", kor : 90, eng : 80, mat : 98, test : "midterm" } )
db.score.insert( { name : "bbb", kor : 100, eng : 100, mat : 76, test : "final" } )
db.score.insert( { name : "ccc", kor : 80, eng : 55, mat : 67, test : "midterm" } )
db.score.insert( { name : "ddd", kor : 70, eng : 69, mat : 67, test : "midterm" } )
db.score.insert( { name : "eee", kor : 60, eng : 80, mat : 78, test : "final" } )
db.score.insert( { name : "fff", kor : 100, eng : 69, mat : 89, test : "midterm" } )
db.score.insert( { name : "ggg", kor : 75, eng : 100, mat : 100, test : "final" } )
=================================================================
- count(), distinct(), sort() : -1 내림차순, limit()
db.score.find(...).count()
db.score.find(...).limit(n)
db.score.find(...).skip(n)
db.score.find(...).sort(...)
SQL Terms, Functions, and Concepts MongoDB Aggregation Operators
WHERE $match
GROUP BY $group
HAVING $match
SELECT $project
ORDER BY $sort
LIMIT $limit
SUM() $sum
COUNT() $sum, $sortByCount
join $lookup
SELECT INTO NEW_TABLE $out
MERGE INTO TABLE $merge (Available starting in MongoDB 4.2)
UNION ALL $unionWith (Available starting in MongoDB 4.4)
MongoDB에서 집계처리하는 방법
1. Aggregation 프레임워크
SQL에서 사용하는 GROUP BY절과 SUM 등으로 이루어진다
MongoShell에서 쿼리와 같은 방법으로 사용된다.
일부 처리($group과 $sort)는 샤드에 대응하고, 각 샤드에서 처리한다.
2. Map / Reduce 기능
Map 함수, Reduce 함수를 정의해서 집계 처리한다.
Aggregation 프레임워크에서 할 수 없는 복잡한 집계 작업을 수행하는데 사용한다.
샤드에 대응하고 있기 때문에 분산 처리를 실시하는 것이 가능하다.
3. 기타 집계 처리, 미들과의 연계(하둡)
더 큰 규모로 집계 처리를 하기 때문에 다른 집계처리 미들웨어 시스템과의 연계를 한다.
미들웨어(middleware) = 분산환경 + 네트워크 통신 + 응용프로그램과의 연계
================================================================
Q1) score의 전체 출력을 해보고 문서의 개수를 구하자
db.score.find()
db.score.find().count()
Q2) score의 이름과 수학점수만 출력해보자
db.score.find({}, {name:1 , mat:1, _id:0})
Q3) score 수학점수 중 70점 이상만 출력해보자
db.score.find({ mat : { $gte : 70 } }, { _id : 0 })
db.score.find({ mat : { $gte : 70 } }, { _id : 0 }).count()
Q4) score 이름과 국어점수를 출력하되 국어점수가 80점 이상만 출력
db.score.find({kor : {$gte : 80}}, {name : 1, kor : 1, _id : 0})
Q5) score 이름과 국어점수를 출력하되 국어점수가 80점 이상 추출해서 합을 구하자
var sr = db.score.find({kor : {$gte : 80}}, {name : 1, kor : 1, _id : 0})
sr ==> 하면 1번은 나오는데 2번부턴 안나온다. print(sr)은 계속 나온다.
var sr = db.score.find({kor : {$gte : 80}}, {name : 1, kor : 1, _id : 0});
var tot = 0;
while (sr.hasNext()){
res = sr.next();
print(res.name + " : " + res.kor);
tot += res.kor;
print("tot = " + tot);
}
print("tot = " + tot);
ex) forEach
db.users.find().forEach( function(myDoc) { print( "user: " + myDoc.name ); } );
var sr02 = db.score.find({kor : {$gte : 80}}, {name : 1, kor : 1, _id : 0});
sr02.forEach(
function(x){
print(x.name + " : " + x.kor);
}
)
Q6) test가 midterm만 이름, test를 출력해보자
db.score.find({test:"midterm"},{name: 1, test:1, _id:0})
db.score.find({test:{$eq : "midterm"}},{name: 1, test:1, _id:0})
ex) forEach
var sm = db.score.find({test:"midterm"},{name: 1, test:1, _id:0})
sm.forEach(function(x){
if(x.test == "midterm"){
print(x.name + " : " + x.test);
}
})
Q7) 이름이 a로 시작하는 문서를 찾아보자 ( oracle like 'A%')
db.score.find({name : /^a/}, {_id : 0})
Q8) 이름이 a로 시작하거나 e로 시작하는 문서를 찾아보자
db.score.find( { $or : [{name : /^a/}, {name : /^e/}] }, { _id : 0 } )
Q9) score에서 test가 m으로 시작하는 문서의 개수를 구하자
db.score.find( { test : /^m/ }, { _id : 0 } ).count()
Q10) 이름을 출력하되 중복되지 않게 출력
distinct( 필드, 쿼리 )
db.score.distinct("name");
db.score.distinct("test");
Q11) 영어점수가 80점 이상인 학생의 이름을 중복되지 않게 출력해보자
db.score.distinct("name", {eng : {$gte : 80}});
Q12) next() 메소드를 사용하자 docs
https://docs.mongodb.com/manual/reference/method/db.collection.find/#mongodb-method-db.collection.find
case1)
var myCursor = db.score.find( );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}
case2)
var myCursor = db.score.find( );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
printjson(myName);
}
case3)
var myCursor = db.score.find( );
myCursor.forEach(printjson);
Q13) test를 출력하되 이름을 오름차순으로 정렬해보자.
db.score.find({}, {name : 1, test : 1}).sort({name : 1});
Q14) 최대값, 최소값을 sort() + limit()
영어점수가 가장 높은 문서를 출력
db.score.find({}, {_id : 0}).sort({eng : -1}).limit(1);
Q15) 국어 점수가 가장 낮은 문서를 출력하자
db.score.find({}, {_id : 0}).sort({kor : 1}).limit(1);
Q16) 5개의 문서중에서 2개를 건너띄고 3줄만 출력
db.score.find({}, {_id : 0}).limit(5).skip(2).limit(3);
Q17) 5개의 문서중에서 2개를 건너띄고 3줄을 수학점수 내림차순으로 출력
db.score.find({}, {_id : 0}).sort({mat : -1}).limit(5).skip(2).limit(3);
Q18) 아래 데이터 입력 후 확인하세요 find()
db.product.save ({name : "notebook", price : 200, category : "material"});
db.product.save ({name : "pencil", price : 80, category : "material"});
db.product.save ({name : "salad", price : 220, category : "food"});
db.product.save ({name : "others", price : 20, category : "material"});
db.product.save ({name : "bread", price : 100, category : "food"});
Q19) 맵리듀스를 활용해서 집계를 구현해보자
collection의 category별로 목록의 개수와 가격의 합을 구해보자
결과 :
{ "_id" : "material", "value" : { "category" : "material", "count" : 3, "amount" : 300 } }
{ "_id" : "food", "value" : { "category" : "food", "count" : 2, "amount" : 320 } }
db.product.help()로 가서 아래를 복사해오기
db.product.mapReduce( mapFunction , reduceFunction , <optional params> )
1. mapFunction : emit을 매개인자로 집계할 key, value 값을 지정한다. 틀을 만들어 주는듯?
function mymap(){
emit( this.category, {category : this.category, count : 1, amount : this.price} );
};
emit() : 특정 키 값별로 값을 그룹핑하는 함수
2. reduceFunction
function myreduce(key, values){
var result = { category : key, count : 0, amount : 0 };
values.forEach( function (v) {
result.count += v.count;
result.amount += v.amount;
});
return result;
};
3. <optional params>
db.product.mapReduce( mymap, myreduce, { out: { replace : "myResult" } } );
db.myResult.find();
Q20) score 컬렉션에서 test를 그룹화해서 개수를 구하자. (MR)myresult02
function mymap(){
emit( this.test, { test : this.test, count : 1 } );
};
function myred(key, values){
var result = { test : key, count : 0 }
values.forEach( function (v) {
result.count += v.count;
});
return result;
};
db.score.mapReduce(mymap, myred, { out : { replace : "myresult02" } } );
db.myresult02.find();
Q21) test 그룹화해서 국어점수 합계, 수학은 평균을 구하자 (MR)myresult03
function myMap(){
emit(this.test, {test : this.test, kor : this.kor, mat : this.mat, count : 1});
};
function myReduce(k, v){
var result = {test : k, sumKor : 0, avgMat : 0, count :0};
v.forEach(function(vv){
result.sumKor += vv.kor;
result.count += vv.count;
result.avgMat += vv.mat;
});
result.avgMat = result.avgMat / result.count;
return result;
};
db.score.mapReduce(myMap, myReduce, {out : {replace : "myResult03"}});
db.myResult03.find();
================================================================
번외) 빅데이터 처리 (비정형 원칙)
수집 : 척화
처리(집계) : MongnDB(js), Nosql(c, c++), 하둡(java 집계), Spark
저장 : 비정형 <-> 정형, 하둡(비정형 미들웨어), 데이터 웨어하우스(정형 미들웨어)
기본 3단계
'데이터과학자 - 강의 > javascript & mongoDB' 카테고리의 다른 글
210615 MongoDB - aggregate, mongofiles (0) | 2021.06.15 |
---|---|
210614 MongoDB - aggregate (0) | 2021.06.14 |
210610 MongoDB (0) | 2021.06.10 |
210609 javascript, MongoDB (0) | 2021.06.09 |
210608 javascript (0) | 2021.06.08 |