영혼의 요양소

MongoDB 연습 문제2 본문

카테고리 없음

MongoDB 연습 문제2

온화수 2014. 6. 2. 16:29

MongoDB/ 몽고/ 몽고 디비/ 몽고 DB/ 데이터베이스



//먼저 cmd에서 mongo를 입력해 켜고,
//아래 DB를 한 줄씩 입력한다.
db.Score.drop()
db.Score.insert({name:"aaa",kor:90,eng:90,mat:98,
      test:"midterm"})

db.Score.insert({name:"bbb",kor:100,eng:100,mat:76,
      test:"term"})

db.Score.insert({name:"ccc",kor:80,eng:55,mat:67,
      test:"term"})

db.Score.insert({name:"ddd",kor:70,eng:69,mat:89,
      test:"midterm"})

db.Score.insert({name:"eee",kor:60,eng:80,mat:78,
      test:"term"})


1.이름, 국어,영어,수학을 출력하되 기말고사만 출력하라.
db.Score.find({"test":"term"},{"name":1,"kor":1,"eng":1,"mat":1});

2.이름과 중간고사만 출력하라.
db.Score.find({"test":"midterm"},{"name":1});

3.이름과 국어점수를 출력하되 국어점수가 90점이상인 학생의 중간고사만 출력하라.
db.Score.find({"test":"midterm","kor":{"$gte":90}},{"name":1,"kor":1});

4.이름,국,영,수를 출력하되 모든 점수가 80이상인 학생의 점수를 출력하라.
db.Score.find({"kor":{"$gte":80
   },
   "eng":{"$gte":80
   },
   "mat":{"$gte":80
   }
   },{
   "name":1,
   "kor":1,
   "eng":1,
   "mat":1
});
5.국어의 합을 구하라.
db.Score.group({"initial":{"sumkor":0},"reduce":function(obg,prev){
   prev.sumkor=prev.sumkor+obj.kor-0; }});
   

6.국어의 합과 수학을 평균을 구하라.
db.Score.group({"initial":{"sumkor":0,"summat":0,"count":0,"avgkor":0,"avgmat":0},
"reduce":function(obj,prev)
{prev.sumkor=prev.sumkor+obj.kor - 0;
 prev.summat=prev.summat+obj.mat - 0;
 prev.count++;
 prev.avgkor=prev.sumkor/prev.count;
 prev.avgmat=prev.summat/prev.count;
}});


db.Score.group({
   "initial":{
      "sumkor":0,
      "summat":0,
      "countmat":0
   },
   "reduce":function(obj,prev){
      prev.sumkor += obj.kor;
      prev.summat += obj.mat;
      prev.countmat++;
   },
   "finalize": function(prev) {
      prev.averagemat = 
         prev.summat / prev.countmat;
   }
});


7.중간고사인 학생의 수학의 합을 구해라.
db.Score.group({
   "initial" :{"summat":0
   },
   "reduce":function(obj,prev){
   prev.summat += obj.mat;
   },
   "cond": {
   "test":"midterm"
   }
});

8.국어의합과 평균을 구하되 test를 그룹으로 구현하라.
db.Score.group({
   "key":{
      "test":true
   },
   "initial" :{"sumkor":0,"sumavgkor":0,"count":0
   },
   "reduce":function(obj,prev){
      prev.sumkor += obj.kor;
   prev.sumavgkor += obj.kor;
   prev.count++;
   },
   "finalize": function(prev) {
      prev.averagekor = 
         prev.sumavgkor / prev.count;
   delete prev.count;
   delete prev.sumavgkor;
   }
});


9.Score테이블의 국어는 최고점수를 출력하라.
db.Score.group({
   "initial":{},
   "reduce":function(obj,prev){
      prev.maxkor =
       isNaN(prev.maxkor) ? obj.kor :
       Math.max(prev.maxkor, obj.kor);
   }
});


10.Score테이블의 영어 최고점수와 수학 최저점수를 출력하라.
db.Score.group({
   "initial":{},
   "reduce":function(obj,prev){
      prev.maxeng =
       isNaN(prev.maxeng) ? obj.eng :
       Math.max(prev.maxeng, obj.eng);
      prev.minmat =
       isNaN(prev.minmat) ? obj.mat :
       Math.min(prev.minmat, obj.mat);
   }
});


11. test의 그룹별 수학최고점수와 최저 점수를 구하라. 
단, 이름에 a, b가 들어있는학생 기준으로.
db.Score.group({
   "key":{"test":true},
   "initial":{},
   "reduce":function(obj,prev){
      prev.maxmat =
       isNaN(prev.maxmat) ? obj.mat :
       Math.max(prev.maxmat, obj.mat)
      prev.minmat =
       isNaN(prev.minmat) ? obj.mat :
       Math.min(prev.minmat, obj.mat);
   },
    "cond":{$or:[{name:/^a/},{name:/^b/}]}
});


db.Score.group({
key:{test:true},
initial:{},
reduce:function(cur,res){
res.minmat = isNaN(res.minmat)?
cur.mat: Math.min(res.minmat, cur.mat)
res.maxmat= isNaN(res.maxmat)? 
cur.mat: Math.max(res.maxmat, cur.mat)},
cond:{$or:[{name:/^a/}, {name:/^b/}]}})