2012-10-18 41 views
2

我有一個MongoDB集合「標記」字段student_id,Subject,Mark。 我想獲得特定學生得分的平均值。 我的項目是在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

如果您在使用MongoDB的2.2可以使用聚合框架此:

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#沒有方法'setMaxListeners'在Object.Document 另一件事我的MONGODB版本是2.0.5。 此外,我的模型和控制器是單獨的'js'文件。我指的是model-model.model_name.aggregate([0]組:這是我在controller中編寫代碼的方式。爲什麼發生此錯誤 – dany

+0

這是錯誤--500 TypeError:Object#沒有方法'setMaxListeners' at Object.Document(D:\ MED_NETWRK \ medinfo.api \ node_modules \ mongoose \ lib \ document.js:30 :8) at Object.Model(D:\ MED_NETWRK \ medinfo.api \ node_modules \ mongoose \ lib \ model.js:26:12) at Object.model [as Doctor](D:\ MED_NETWRK \ medinfo.api (D:\ MED_NETWRK \ medinfo.api \ controllers \ DoctorController.js:54:20) at callbacks(D:\ MED_NETWRK \ medinfo)\ node_modules \ mongoose \ lib \ model.js:910:11) at controller.getDoctor .API \ node_modules \表現\ LIB \路由器\ index.js:272:11)...以及更多行。 – dany

+0

@dany這是因爲您使用的是MongoDB 2.0.5,但聚合框架需要2.2+。你能升級到2.2嗎? – JohnnyHK

2

這聽起來像海報MongoDB中的Map/Reduce操作的子例子。

你想要做的是首先運行一個地圖步驟,在那裏你發出屬於學生ID爲111的所有成績。 然後你運行reduce步驟來平均它們。

的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; 
} 

而且在蒙戈語法MapReduce的執行:

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。你可以在哪裏查詢它。

要了解如何使用MapReduce的貓鼬中請看看這個問題:mongoose mapreduce()

+0

謝謝。但我是一個初學者,所以我不完全明白如何將這個作爲Mongoose查詢。 – dany

+0

我在SO編輯了一個參考Mongoose的MapReduce問題的答案。 – Tigraine