2012-10-16 6 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, 
    }, 
    } 
} 

은 "필드"속성이 개 필드 "등급"과의 "능력"을 가지고있다. 그러나 각 항목에는 다른 필드 세트가있을 수 있습니다. 예. 크기, 가격 등을 포함 할 수 있습니다.

"필드"아래에 "등급"이있는 모든 항목을 찾아 이러한 항목의 "가중치"속성의 합계를 얻고 싶습니다.

나는 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"}); 
관련 문제