2012-10-18 3 views
2

나는 student_id, Subject, Mark 필드가있는 MongoDB 콜렉션 "마크"를 가지고있다. 특정 학생이 채점 한 점수의 평균값을 원합니다. 프로젝트가 NodeJs에 있고 객체 모델링에 MongooseJS를 사용하고 있습니다. MOngooseJS를 사용하여이 질문을하는 방법은 무엇입니까?mongoosejs에서 열의 합계/평균값을 취함

예 내가 원하는

 Student_id Subject Mark 
    111   AAA  9 
    111   BBB  5 
    111   CCC  7 
    222   AAA  10 
    222   CCC  6 
    222   BBB  8 

학생 (ID)로 득점 마크의 평균 (111) 즉, ((9 + 5 + 7)/3) = 7)

답변

11

는이에 대한 통합 프레임 워크를 사용할 수 있습니다 :

var Mark = mongoose.model('mark', new Schema({ 
    Student_id: Number, 
    Subject: String, 
    Mark: Number 
})); 

Mark.aggregate([ 
     { $group: { 
      _id: '$Student_id', 
      markAvg: { $avg: '$Mark'} 
     }} 
    ], function (err, results) { 
     if (err) { 
      console.error(err); 
     } else { 
      console.log(results); 
     } 
    } 
); 

출력 :

이 질문을보고하십시오 몽구스에서 맵리 듀스를 사용하는 방법을 참조하십시오

[ { _id: 222, markAvg: 8 }, { _id: 111, markAvg: 7 } ] 
+0

시도했지만 오류가 발생했습니다 - 500 TypeError : Object # 에는 Object.Document에 'setMaxListeners'메서드가 없습니다 또 다른 것은 내 MONGODB 버전이 2.0.5입니다. 또한 내 모델과 컨트롤러는 별도의 'js'파일입니다. 모델을 model.model_name.aggregate ([ {$ group : ..... $ group : ..... 이것은 model.Can으로 작성한 코드입니다. 이 오류가 발생한 이유를 알려주십시오 – dany

+0

이것은 -500 TypeError 오류입니다 : Object # 에는 Object.Document ('D : \ MED_NETWRK \ medinfo.api \ node_modules \ mongoose \ lib \ document.js : 30'에서 'setMaxListeners' ) 메소드가 없습니다. : D : \ MED_NETWRK \ medinfo.api) Object.model에있는 (D : \ MED_NETWRK \ medinfo.api \ node_modules \ mongoose \ lib \ model.js : 26 : 12) at Object.model [ (D : \ MED_NETWRK \ medinfo.api \ controllers \ DoctorController.js : 54 : 20) 콜백 위치에서 (D : \ MED_NETWRK \ medinfo \ node_modules \ mongoose \ .api \ node_modules \ express \ lib \ router \ index.js : 272 : 11) ... 그리고 몇 줄 더. – dany

+0

@dany MongoDB 2.0.5를 사용하고 있지만 집계 프레임 워크에 2.2 이상이 필요하기 때문입니다. 2.2로 업그레이드 할 수 있습니까? – JohnnyHK

2

이는 포스터 같은 소리 MongoDB에서 Map/Reduce 자식의 자식 예제.

먼저 학생 ID 111에 속하는 모든 성적을내는지도 단계를 실행하십시오. 그런 다음 평균을 내리는 단계를 축소 단계로 실행합니다.

monogdb 코드는 다음과 유사합니다 :

var map = function() { 
    emit(this.Student_id, this.Mark); 
} 
var reduce = function(key, values) { 
    var result = { studentid: key, mark_sum: 0, count: 0, avg_mark: 0 }; 
    values.forEach(function(v) { 
    r.mark_sum += v; 
    r.count += 1; 
    }); 
    return r; 
} 

var finalize = function(key, value) { 
    if (value.count > 0) { 
    value.avg_mark = value.mark_sum/value.count; 
    } 
    return value; 
} 

그리고 몽고 구문의 맵리 듀스의 실행을 :

var command = db.runCommand({ mapreduce:"<your collection>", 
        map: map, 
        reduce: reduce, 
        query: { Student_id: 111 }, 
        out: { reduce: "session_stat" }, 
        finalize: finalize 
       }); 

map_reduce의 결과는 session_stat에 기록됩니다. 어디에서 쿼리 할 수 ​​있습니다. 당신이 MongoDB를 2.2을 사용하는 경우 mongoose mapreduce()

+0

고맙습니다. 그러나 나는 초심자이므로 이것을 몽구스 쿼리로 가져 오는 방법을 완전히 이해하지 못했습니다. – dany

+0

나는 여기에 몽구스가있는 MapReduce 질문에 대한 참조로 답을 편집했습니다. – Tigraine

관련 문제