【发布时间】: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