【问题标题】:MongoDB Query takes too longMongoDB 查询耗时过长
【发布时间】:2015-10-23 06:36:31
【问题描述】:

问题:为用户创建第一个文档时,查询时间过长

我正在创建模式报告的一些报告。我也有一个 UserSchema。我在我的 UI 中创建了一个文档并将该数据传递给一个发布请求,它是这样的:

exports.addSubReport = function(req,res) {

        var id = req.body.masterform;
        var subform = new Report();
        var myDate = Date();
        subform.title = req.body.title;
        subform.date = req.body.date;
        subform.date = myDate;
        subform.owner = req.user;
        subform.body = req.body.body;
        subform.save();
        Report.findById(id, function (err, report) {
          if(err) {
            res.redirect('/404NotFound');
          }
          else {
            report.subreport.push(subform);
            subform.parentReport = report;
            report.save();
          }
        });
        User.findById(req.body.id, function (err, user) {
            user.forms_created.push(subform);
            subform.owner = req.user;
            subform.authors[0] = user.profile.firstName + " " + user.profile.lastName;
            subform.author = user;
            subform.save();
        });

        res.json(req.body);
    };

这可以正常工作并按照我想要的方式创建对象,但是在创建文档后,我将 UI 中的状态设置为“等待”,直到我可以使用刚刚创建的这个新报告接收 JSON。这是 GET 请求代码:

exports.allMyReports = function(req, res) {
var id = req.user._id;
        var totalproc = 0;
        var dupe = [];
        Report.find({"author" : id}, function (err, form) {
            dupe = form;

            dupe.forEach(function (person) {

                User.findById(person.author, function (err, user) {
                    if (!err) {
                        person.authors[0] = user.profile.firstName + " " + user.profile.lastName;
                        person.save();
                        totalproc = totalproc + 1;

                    }
                    if (totalproc == dupe.length) {
                        res.json(dupe);
                    }
                }

                );
            });


        });
};

但问题是,在我为用户创建的每一份第一份报告中,都需要很长时间。这很可能是按作者搜索它的查询,但比我想的要好....如果用户已经有 15 个文档,它如何甚至立即找到所有这些文档?我不知道为什么在这种情况下需要这么长时间,而且我还没有提出解决方案,但我认为这与我的查询方式有关。

这是我如何在 UI 中执行此操作的示例:

_onCreateReport = () => {
  const title = React.findDOMNode(this.refs.title).value;
  const date = React.findDOMNode(this.refs.date).value;
  const body = React.findDOMNode(this.refs.body).value;
  ReportsActions.addNewReport({
        title: title,
        date: date,
        body: body
    });
  ReportsActions.getMyReports();
}

我执行添加新报告的操作(向 API 发出“发布”请求),然后为属于我的所有报告向 api 获取 getMyReport“获取”请求,一旦返回它会显示 3 个按钮的新渲染,一个查看该文档,一个查看我的所有文档,一个创建另一个报告。

【问题讨论】:

  • 这是否仅在创建第一个报告时发生?还是用于创建每个报告?
  • 只是第一个初始报告,如果该用户有任何数量的文档 > 1,则任务几乎立即完成。
  • 你是说,做一个 Report.find({}) 查询所有文档,然后开始为用户遍历返回的数组吗?是的,我也这么认为,我已经开始这样做了。至于反应部分,我只是调用 ajax 调用(POST 请求),addNewReport 中的所有内容都是我为 POST 请求发送的数据,我也在某处调用 GET 请求,但它是异步的。将反馈结果!
  • 好的,我优化了它。我天真地认为每次为用户查询每个文档不会因为它的扩展而昂贵,但无论如何我都不应该那样做。相反,我所做的只是将我的查询重用于所有报告 api,并让前端处理其余部分。在前端,我只是遍历了我的数组并保留了与当前登录用户匹配的元素。对于创建文档的用户,数据的接收速度比以前快了很多。如果您想提交评论作为您的答案 Matthew Antolovich,我不介意将其选为正确的。谢谢!

标签: node.js mongodb mongoose reactjs flux


【解决方案1】:

我所做的只是请求所有文件,并在前端解决。它减少了 ajax 调用的时间,我只是在我的前端过滤掉了它,它执行得很快并且不会阻止服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2019-08-02
    • 2011-11-03
    • 2012-11-04
    • 2013-07-24
    • 2015-09-08
    相关资源
    最近更新 更多