2016-01-04 58 views
1

我想使用mapreduce方法來獲得男性和女性留在一個特定的區域計數。我正在使用以下代碼,然後編寫一個邏輯來計算值。想知道這是否可以在模塊內完成。這是可能的,或者我現有的做法是做貓鼬mapreduce按性別和地區

module.export.findStudentsForGivenAdministrativeAreaInAState = function(administrativeArea){ 
var o = {}; 
var self = this; 
o.map = function() { 
    var values = {gender:this.gender,area_level_2:this.address.administrative_area_level_2}; 
    emit(this._id, values) 
}; 
o.reduce = function (k, vals) { 
    return vals; 
}; 
o.query = { 
    'address.administrative_area_level_1': administrativeArea 
}; 

return new Promise.resolve(Student.mapReduce(o)) 
    .then(function (data) { 
     return data; 
    }).catch(function (error) { 
     routesLogger.logError("studentDAL", "getDistinctStatesWhereStudentsAreRegistered", error); 
     return error; 
    }); 
}; 
+1

你能後的預期結果?你是否在字段'administrative_area_level_2'中指定了特定區域? –

+0

我確實將該字段指定爲輸出的一種補充。我正在通過行政區域。如果我說了2個不同的administrative_area_level_2,我希望得到[{_id:xxxx,area_level_2:「District1」,男士:2,女士:2,count:4},{_id:xxxx,area_level_2:「District2」 4,女:4,數:8}] –

回答

0

這樣的方式,也可以使用aggregation framework,因爲聚集在服務器(C++)本機運行,其具有更好的性能做了,而MapReduce的產卵獨立JavaScript線程運行JavaScript代碼。因此,您可以運行以下aggregation管道來達到相同的結果:

var Student = require('../../../models/Student'); 
module.exports.findStudentsForGivenAdministrativeAreaInAState = function(administrativeArea, callback){ 
    var pipeline = [ 
     { 
      "$match": { "address.administrative_area_level_1": administrativeArea } 
     }, 
     { 
      "$group": { 
       "_id": "$address.administrative_area_level_2", 
       "men": { 
        "$sum": { 
         "$cond": [ { "$eq": [ "$gender", "male" ] }, 1, 0 ] 
        } 
       }, 
       "women": { 
        "$sum": { 
         "$cond": [ { "$eq": [ "$gender", "female" ] }, 1, 0 ] 
        } 
       }, 
       "count": { "$sum": 1 } 
      } 
     } 
    ]; 

    Student.aggregate(pipeline, function (err, results) { 
     if(err) { callback(err); } 
     else { 
      console.log(results); 
      callback(null, results); 
     }; 
    }); 
}; 
+0

@RahulGanguly無後顧之憂。什麼是問題? – chridam