2016-09-05 2 views
1

私はmongo dbとmapを初めて使用しています。この問題は残っています。 は、以下の私のコレクションの文書形式である: -mongo dbのMapReduceは大きなデータの入力を0にしています

私は50000個の文書が、50,00,000文書を持つコレクションへの帰国間違った結果をコレクションにそれをテストしたときに私のクエリが動作し
`{ 
    "_id" : ObjectId("57c9b650d803090f7e43864c"), 
    "imei" : "2670988969039437", 
    "model" : "XYX", 
    "cId" : "168", 
    "src" : "XYZZZ", 
    "feedback" : "downloaded_gcm", 
    "ts" : "2016-08-04 09:51:18" 
}` 

。以下

私のマップは、クエリを減らすです:

` 
db.colectionNAme.mapReduce(
function() { 
    var key = this.model; 
    var val = { 
     installed : 0, 
     received : 0, 
     gcm_cancel : 0, 
     downloaded_gcm : 0, 
     gcm_acticated : 0, 
     gcm_ok : 0 
    }; 

    if(this.feedback == "installed") { 
     val.installed++; 
    } else if(this.feedback == "received") { 
     val.received++; 
    } else if(this.feedback == "gcm_cancel") { 
     val.gcm_cancel++; 
    } else if(this.feedback == "downloaded_gcm") { 
     val.downloaded_gcm++; 
    } else if(this.feedback == "gcm_acticated") { 
     val.gcm_acticated++; 
    } else if(this.feedback == "gcm_ok") { 
     val.gcm_ok++; 
    } 
    emit(key, val); 
}, 

function(key,values) { 
    var val = { 
     installed : 0, 
     received : 0, 
     gcm_cancel : 0, 
     downloaded_gcm : 0, 
     gcm_acticated : 0, 
     gcm_ok : 0 
    }; 

    values.forEach(function(value) { 
     val.installed += value.installed; 
     val.received += value.received; 
     val.gcm_cancel += value.gcm_cancel; 
     val.downloaded_gcm += value.downloaded_gcm; 
     val.gcm_acticated += value.gcm_acticated; 
     val.gcm_ok += value.gcm_ok; 
    }); 

    return val; 
}, 
{ 
    query:{cId : "166"}, 
    out:"mapRedResults", 
    sort:{model:1}, 
    jsMode: true, 
    usev8 :true 
} 
);` 

、これは、それが与える出力されます: -

{ 
    "result" : "mapRedResults", 
    "timeMillis" : 2221, 
    "counts" : { 
    "input" : 0, 
    "emit" : 0, 
    "reduce" : 0, 
    "output" : 0 
    }, 
    "ok" : 1 
} 

をそのが..itが0の入力を取り、結果から明らかなように... 私はamazon t2.micro ec2インスタンスでそれをやっています。

+0

あなたはまだ、より効率的に同じタスクの集計パイプラインを作成すると考えたことがありますか? http://stackoverflow.com/questions/37938257/get-count-of-loglevel-for-each-name/ – chridam

+0

@chridam ...はい....私はすでに集約を使ってこれを行っています...しかし、私はmapreduceを使ってそれをやりたかった..... –

+0

@chridam:あなたの提案に感謝しています。しかし、私が何をしているのか何かが間違っていると説明してください。私は本当に分かりません。そこにある欠陥.....私は毎日たくさんのデータを取得しており、インクリメンタルマップを使用したいので、マップを減らしたいと思っています。 –

答えて

1

残念ながら、問題がどこにあるのか正確には分かりませんが、集計フレームワークとしてC + +コード内のMongoDB内で実行されるので、AFパイプラインは最適化されるためMapReduceよりもパフォーマンスは向上します(MapReduceはV8/spidermonkey内で実行されます)。バージョン)の環境を別のスレッドで別々のスレッドで実行し、指定したコードを使用して文書の一部を縮小し、特定のフィールドに集約します。

アグリゲーションフレームワークを使用するソリューションでは、ポインタとしてGet count of “loglevel” for each “name”を参照できます。


あなたが何らかの理由または別のためのMapReduceで立ち往生している場合は、私はあなたが動的プロパティとしてフィードバック値を持つオブジェクトを作成することにより、不要な変数のチェックと代入を回避するためにコードをリファクタリングお勧めします。たとえば、あなたは、単に同じMapReduceの操作を実行することができます

map = function() { 
    if (!this.feedback) return; 
    var obj = {}; 
    obj[this.feedback] = 1;  
    emit(this.model, obj); 
}; 

reduce = function(key, values) { 
    var counts = {}; 
    values.forEach(function(v) { 
     for(var k in v) { 
      if(!counts[k]) 
       counts[k] = 0 
      counts[k] += v[k]; 
     } 
    }); 

    return counts; 
}; 

myMapReduce = db.runCommand({ 
    "mapreduce": "colectionNAme", 
    "map": map, 
    "reduce" : reduce, 
    "out": "mappedResults" 
}); 

db[myMapReduce.result].find(); 
関連する問題