2

私は次の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,
     },
  } 
}

「fields」属性には、「rating」と「capacity」の 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 } });
4

1 に答える 1

1

私はついにそれを理解し、それを機能させることができました。以下のコードを共有しました。

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"});
于 2012-10-18T17:29:08.743 に答える