2012-10-16 129 views
2

在查找字段的總和(如果存在的話),我有以下的MongoDB結構MongoDB中 - 集合

{ 
    "_id": ObjectId("507c80a143188f9610000003"), 
    "date": ISODate("2012-10-15T21: 31: 13.0Z"), 
    "uid": NumberInt(35920), 
    "comp": NumberInt(770), 
    "fields": { 
    "rating": { 
     "parent": "rating", 
     "weight": NumberInt(2), 
     "rel_weight": 0.11, 
    }, 
    "capacity": { 
     "parent": "capacity", 
     "weight": NumberInt(4), 
     "rel_weight": 0.89, 
    }, 
    } 
} 

的「域」屬性有2場「評級」,並在其「能力」。但是,每個條目可能有不同的一組字段。例如。尺寸,價格等。

我想找到所有在「字段」下有「評級」的條目,並獲得所有這些條目的「重量」屬性的總和。

我是mongodb的新手,我嘗試使用mapReduce函數,但沒有用。

下面給出的是我使用的代碼。請讓我知道我錯了什麼地方,或者是否有更好的解決方案而不是此代碼。

function map(){ 
    emit(this._id,{weight:this.fields.rating.weight}); 
} 


function reduce(key,value){ 
    var sum = 0; 
    for (var i=0; i<value.length; i++) { 
     sum += value[i].amount; 
    } 
    return sum; 
} 


res = db.collection_name.mapReduce(map, reduce, { query: {"fields.rating" : { $exists: true } }); 

回答

0

我終於弄明白了,並得到它的工作。我已經在下面分享了我的代碼。

var map = function(){ 
    if(this.fields.rating){ 
     emit(this.fields.rating.parent,this.fields.rating.weight); 
    } 
} 

var reduce = function (k, vals) { 
    var sum = 0; 
    var count = 0; 
    for (var i in vals) { 
     sum += vals[i]; 
    count++; 
    } 
    var avg = (sum/count); 
    return avg; 
} 

var res = db.myCollection.mapReduce(map, reduce, {out:"myoutput"});