簡體   English   中英

Node JS中的大型MongoDB數據庫加載緩慢

[英]Slow Loading of Large MongoDB Database in Node JS

我用Node JS,Express JS,Mongoose和D3 JS創建了一個網頁。

在網頁中,它包含3個下拉菜單:部門,員工,周。 該網頁的用法如下:

  1. 當選擇“部門”時,“員工”菜單將被過濾以僅顯示所選“部門”中的人員。 選擇“員工”后,“周”也一樣。
  2. 選擇3個菜單並單擊“ PLOT”按鈕后,將繪制折線圖(使用d3.js)以顯示該月員工的工作時間。

MongoDB傑森

{ 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'中使用它來過濾菜單選項。

有沒有更好的方法可以解決性能問題?

幾乎沒有必要將所有數據發送到客戶端。 實際上,我還沒有看到具有單個端點的API,該API可以將整個數據庫返回給每個人。

很難為您提供任何特定的解決方案,而不知道您的數據看起來如何,數據多大,增長多快等。性能問題可能與查詢數據庫,大型數據傳輸或大型JSON解析有關。瀏覽器。

無論如何,您都不應無限制地將所有數據庫發送到客戶端。 通常,它是通過跳過許多記錄和返回最大記錄數來實現的。

諸如LoopBack之類的某些框架可以為您完成此任務,請參閱:

如果您使用的是Express,則必須自己實施限制。

要測試瓶頸,您可以運行Mongo Shell並嘗試從那里運行.find({},{})查詢,以查看需要多長時間。 您可以在瀏覽器的開發人員工具中查看傳輸大小和時間。 這可能會發現您縮小了最需要注意的地方,但是無論數據庫多大,返回整個數據庫已經是一個不錯的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM