【问题标题】:Slow Loading of Large MongoDB Database in Node JSNode JS中大型MongoDB数据库加载缓慢
【发布时间】:2016-09-23 09:18:24
【问题描述】:

我用 Node JS、Express JS、Mongoose 和 D3 JS 创建了一个网页。

在网页中,它包含 3 个下拉菜单:部门、员工、周。 网页的用法如下:

  1. 选择“部门”时,将过滤“员工”菜单以仅显示所选“部门”的菜单。选择“员工”后的“周”也是如此。
  2. 选择 3 个菜单并单击“绘图”按钮后,将绘制一个折线图(使用 d3.js)以显示该月员工的工作时间。

MongoDB Json

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

这是我的代码的 sn-ps:

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”中使用它来过滤我的菜单选项。

有没有更好的方法来解决性能问题?

【问题讨论】:

    标签: html node.js mongodb d3.js


    【解决方案1】:

    很少需要将所有数据发送给客户端。事实上,我还没有看到一个 API 有一个端点可以将整个数据库返回给所有人。

    如果不知道您的数据是什么样子、有多大、增长速度等,很难为您提供任何具体的解决方案。性能问题可能与查询数据库、大数据传输或大 JSON 到由浏览器解析。

    在任何情况下,您都不应该无限制地将所有数据库发送给客户端。通常它是用要跳过的记录数和要返回的最大记录数来实现的。

    像 LoopBack 这样的一些框架会为你做这件事,请参阅:

    如果您使用 Express,则必须自己实施限制。

    要测试瓶颈,您可以运行 Mongo shell 并尝试从那里运行 .find({},{}) 查询以查看需要多长时间。您可以在浏览器的开发者工具中查看传输大小和时间。这可能会发现您缩小了最需要关注的地方,但返回整个数据库(无论它有多大)已经是一个不错的起点。

    【讨论】:

    • 对不起,已经添加了JSON数据示例,是的,我已经在浏览器中使用了调试器,瓶颈确实是返回整个数据库。
    • 如果我没有获得整个数据库,是否有其他方法可以获取所需的 Dep、Emp、Mth 数据以插入下拉菜单?
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多