2016-09-23 15 views
0

Node JS、Express JS、Mongoose、D3 JSでWebページを作成しました。Node JSでの大規模なMongoDBデータベースの読み込みが遅い

ウェブページには、Department、Employee、Weekの3つのプルダウンメニューがあります。 次のようにWebページの使用法は次のとおりです。

  1. 「課」が選択されている場合は、「従業員」メニューはのみ選択された「部門」からを表示するようにフィルタリングされます。 「従業員」が選択された後も「週」になります。
  2. 3つのメニューが選択され、 'PLOT'ボタンがクリックされると、月の従業員の勤務時間を示す折れ線グラフ(d3.jsを使用)がプロットされます。ここで

MongoDBはJSON

{ dep: '1', 
    emp: 'Mr A', 
    week: 1, 
    hrs: [{ 
      {1,8}, 
      {2,10}, 
      ... 
     }] 
} 

私のコードの抜粋です:

routes.js

// Connect the required database and collection 
var dataAll = require('./models/dataModel'); 

module.exports = function(app) { 

app.get('/api/data', function(req, res) { 
    dataAll.find({}, {}, function(err, dataRes) { 
     res.json(dataRes); 
    }); 
} 

app.get('*', function(req,res) { 
    res.sendfile('./index.html'); 
} 
} 

index.htmlを

... // More codes 
<div id="menuSelect1"></div> 
<div id="menuSelect2"></div> 
<div id="menuSelect3"></div> 
... 
<script src="./display.js" type='text/javascript'></script> 
... // More codes 

display.js

//Menu (Department,Employee,Week) Information is gathered here 

queue() 
.defer(d3.json, "/api/data") 
.await(createPlot); 

function createPlot(error, plotData) { 
var myData = plotData; 

var depData = d3.nest() 
     .key(function(d) {return d.dep;}) 
     .rollup(function(v) {return v.length;}) 
     .entries(myData); 

selectField1 = d3.select('#menuSelect1') 
     .append("select") 
     .on("change", menu1change) 
     .selectAll(depData) 
     .enter() 
     .append("option") 
     .attr("value", function(d) {return d.key;}) 
     .text(function(d) {return d.key;}); 

function menu1Change() { 
    //Filter Next Menu with the option chosen in this menu 
    ... // More codes 
    var selectedVal = this.options[this.selectedIndex].value; 
    var empData = dataSet.filter(function(d) { return d.emp = selectString; }); 
    ... // More codes 
} 
... // More codes 

}

問題: 機能的には、期待どおりに動作しています。問題は、データベースが大きくなったり大きくなったりすると、ページの読み込みが非常に遅くなる(読み込みに要する時間)。私はそれがすべてのデータ(.find({}、{})を取得するルーティングが原因でなければならないと思うが、私は 'display.js'でメニューオプションをフィルタリングするために使用しているので、

これを実行してパフォーマンスの問題を解決する方法がありますか?

答えて

0

すべてのデータをクライアントに送信することはめったにありません。実際、データベース全体を全員に返す単一のエンドポイントを持つAPIは見ていません。

データの見た目、大きさ、成長の速さなどを知らない特定の解決策はありません。パフォーマンスの問題は、データベース、大きなデータ転送、または大きなJSONブラウザで解析します。

いずれの場合でも、制限なしですべてのデータベースをクライアントに送信しないでください。通常、スキップするレコードの数と、返すレコードの最大数で実装されます。

ループバックのようないくつかのフレームワークはあなたのためにそれを行い、以下を参照してください。

あなたはExpressを使用している場合、あなたは限界を自分で実装する必要があります。

ボトルネックをテストするには、Mongoシェルを実行してそこから.find({},{})クエリを実行して、どれくらい時間がかかるかを調べることができます。転送サイズと時間は、ブラウザの開発者ツールで確認できます。これは、ほとんどの注意を必要とする場所を絞り込むかもしれませんが、それがどれほど大きくてもデータベース全体を返すことは、すでに始めるのに適しています。

+0

申し訳ありませんが、JSONデータの例を追加しました。はい、私は既にブラウザでデバッガを使用しました。ボトルネックは実際にデータベース全体を返しています。 – ISee

+0

データベース全体を取得できない場合、必要なDep、Emp、Mthデータをプルダウンメニューに挿入する他の方法はありますか? – ISee

関連する問題