2017-06-27 7 views
2

私は300万の文書を持つコレクションを1つ持っています。各ドキュメントには40個のフィールドがあります。フィールドは次のようなものです。mongoDB mapreduceが3m文書を実行するのに長時間かかる

{ 
    "b_date" : "2016-04-05", 
    "d_date" : "2016-06-25", 
    "pos" : "MISC", 
    "origin" : "DXB", 
    "destination" : "HGA", 
    "pax" : 1, 
    "pax_1" : 2 
}, 
{ 
    "b_date" : "2016-04-05", 
    "d_date" : "2016-06-25", 
    "pos" : "MISC", 
    "origin" : "DXB", 
    "destination" : "HGA", 
    "pax" : 4, 
    "pax_1" : 5 
}, 
{ 
    "b_date" : "2016-04-05", 
    "d_date" : "2016-06-26", 
    "pos" : "MISC", 
    "origin" : "DXB", 
    "destination" : "HGA", 
    "pax" : 3, 
    "pax_1" : 3 
} 

今私はb_dated_dateposorigindestinationフィールドをグループ化することによってpaxpax_1の合計を取得したいです。 累積paxはpos,origin,destinationのフィールドでグループ化されますが、累積paxおよびpax_1は、昇順にb_dateおよびd_dateの順に増加する必要があります。

予想される結果です。

{ 
    "_id.dep_date" : "2016-04-05", 
    "_id.sale_date" : "2016-06-25", 
    "_id.pos" : "MISC", 
    "_id.origin" : "DXB", 
    "_id.destination" : "HGA", 
    "value.pax" : 5, 
    "value.cumulative_pax":5, 
    "value.pax_1" : 7, 
    "value.cumulative_pax_1":7, 

}, 
{ 
    "_id.dep_date" : "2016-04-05", 
    "_id.sale_date" : "2016-06-26", 
    "_id.pos" : "MISC", 
    "_id.origin" : "DXB", 
    "_id.destination" : "HGA", 
    "value.pax" : 3, 
    "value.cumulative_pax":8, 
    "value.pax_1" : 3, 
    "value.cumulative_pax_1":10, 
} 

私のMapReduceコード

db.collection.mapReduce(
function() { 
    emit(
    { 
    "pos" : this.pos, 
    "origin" : this.origin, 
    "destination" : this.destination, 
    'dep_date': this.d_date, 
    'sale_date': this.b_date, 

}, 
    { 
     'pax':this.pax, 
     'pax_1':this.pax_1, 
    } 
    ); 
} 
, 
function(key,values) { 
    paxt = 0; 
    paxt_1 = 0; 
    for (var i in values){ 
    paxt += values[i].pax; 
    paxt_1 += values[i].pax_1; 
    } 
    return {'pax':paxt, 
    'pax_1':paxt_1, 
    }; 
} 
, 
{ 
    'scope':{ 
     'pos':'', 
     'origin':'', 
     'destination':'', 
     'dep_date': '', 
     'sale_date': '', 
     'result':{} 
    } 
    , 
    'finalize':function(key,value) { 
     if (pos != key.pos || 
      origin != key.origin || 
      destination != key.destination || 
      ){ 
      result['pax'] = 0; 
      result['pax_1'] = 0; 
      result['cumulative_pax'] = 0; 
      result['cumulative_pax_1'] = 0; 
     } 
      result['pax'] += value.pax; 
      result['cumulative_pax'] = value.pax; 
      result['pax_1'] += value.pax_1; 
      result['cumulative_pax_1'] = value.pax_1; 
      pos = key.pos; 
      origin = key.origin; 
      destination = key.destination; 
      dep_date = key.dep_date; 
      sale_date = key.sale_date; 

     return result; 
     } 
    , 
    'out':'some_collection' 
    } 
) 

このマップ期待値を返す減らすが、それは、3時間のような時間のあまりを取りました。それは 'b_date'と 'd_date'のために文字列形式の日付ですか?または最適化を行う方法について説明します。
集計は3分以内に結果を返していますが、集計を使用して累積paxを取得できませんでした。

答えて

1

地図のコードを削減し、

db.collection.mapReduce(
function() { 
    emit(
    { 
    "pos" : this.pos, 
    "origin" : this.origin, 
    "destination" : this.destination, 
    'dep_date': this.d_date, 
    'sale_date': this.b_date, 

}, 
    { 
     'pax':this.pax, 
     'pax_1':this.pax_1, 
    } 
    ); 
} 
, 
function(key,values) { 
    paxt = 0; 
    paxt_1 = 0; 
    for (var i in values){ 
    paxt += values[i].pax; 
    paxt_1 += values[i].pax_1; 
    } 
    return {'pax':paxt, 
    'pax_1':paxt_1, 
    }; 
} 
, 
{ 
    'scope':{ 
     'pos':'', 
     'origin':'', 
     'destination':'', 
     'dep_date': '', 
     'sale_date': '', 
     'result':{} 
    } 
    , 
    'finalize':function(key,value) { 
     if (pos != key.pos || 
      origin != key.origin || 
      destination != key.destination || 
      ){ 
      result['pax'] = 0; 
      result['pax_1'] = 0; 
      result['cumulative_pax'] = 0; 
      result['cumulative_pax_1'] = 0; 
     } 
      result['pax'] += value.pax; 
      result['cumulative_pax'] = value.pax; 
      result['pax_1'] += value.pax_1; 
      result['cumulative_pax_1'] = value.pax_1; 
      pos = key.pos; 
      origin = key.origin; 
      destination = key.destination; 
      dep_date = key.dep_date; 
      sale_date = key.sale_date; 

     return result; 
     } 
    , 
    'out':'some_collection' 
    } 
) 
関連する問題