저널링은?
복제시스템을 가지고 있는 샤딩분산작업을 했을 때
파일시스템이 변경됐을 때(데이터를 수정했을 때)
저널링 파일시스템이란게 발생을 해서 
커밋단계를 만들어준다.

몽고디비는 
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

+ Recent posts