node.js - 填充更多的猫鼬集合字段导致节点js api中的响应时间延迟
问题描述
我用猫鼬在节点 js 中编写了 api,其中一个集合有很多外部字段引用。客户端需要填充它们,这会导致响应时间延迟。
我尝试仅获取主集合中引用的其他集合的那些文档。
下面是一段代码,其中 Lead 是主要集合,它包含其他集合的引用,如项目、列表、受让人。我正在尝试将这些引用的文档与潜在客户收集数据一起填充。
return db.model('Lead').aggregate([
{
$facet: {
totalData: [
{ $match: queryObj },
{ $group: { _id: { email: "$email", phone: "$phone" }, count: { $sum: 1 }, leads: { $push: { _id: "$_id", name: "$name", firstName: "$firstName", lastName: "$lastName", email: "$email", project: "$project", list: "$list", assignee: "$assignee", phoneCode: "$phoneCode", phone: "$phone", createdAt: "$createdAt", updatedAt: "$updatedAt", utmSource: "$utmSource", source: "$source", unreadmembers: "$unreadmembers" } } } },
{ $sort: sortObj },
{ $skip: (page - 1) * count },
{ $limit: count }
],
totalCount: [
{ $match: queryObj },
{ $group: { _id: { email: "$email", phone: "$phone" } } },
{ $count: "leadsCount" }
]
}
}
]).collation({ locale: "en" }).allowDiskUse(true).exec(async (err, leadsData) => {
if (err)
return res.apiError('Failed to get leads!');
else {
let leads = (leadsData[0] && leadsData[0].totalData && leadsData[0].totalData.length) ? leadsData[0].totalData : [];
let leadsCount = (leadsData[0] && leadsData[0].totalCount && leadsData[0].totalCount.length && leadsData[0].totalCount[0] && leadsData[0].totalCount[0].leadsCount) ? leadsData[0].totalCount[0].leadsCount : 0;
let leadsNew = leads.map(obj => obj.leads);
leadsNew = [].concat(...leadsNew);
let assignees = {};
let assigneeIds = leadsNew.filter(ele => ele.assignee && (ele.assignee !== '' || ele.assignee !== null)).map(l => l.assignee);
assigneeIds.forEach(_id => (assignees[_id.toString()] = _id));
let assigneesList = Object.values(assignees);
assigneesList = await db.model('User').find({ _id: { $in: assigneesList } }, { email: 1 }).lean();
let projects = {};
let projectIds = leadsNew.filter(ele => ele.project && (ele.project !== '' || ele.project !== null)).map(l => l.project);
projectIds.forEach(_id => (projects[_id.toString()] = _id));
let projectsList = Object.values(projects);
projectsList = await db.model('Project').find({ _id: { $in: projectsList } }, { name: 1 }).populate({ path: 'teams', select: { name: 1, members: 1 } }).lean();
let leadLists = {};
let listIds = leadsNew.filter(ele => ele.list && (ele.list !== '' || ele.list !== null)).map(l => l.list);
listIds.forEach(_id => (leadLists[_id.toString()] = _id));
let lists = Object.values(leadLists);
lists = await db.model('List').find({ _id: { $in: lists } }, { name: 1 }).lean();
leads.map(l => {
l.leads.map(p => {
if (p.assignee)
p.assignee = assigneesList.find(a => a._id.toString() === p.assignee.toString()) || '';
if (p.project)
p.project = projectsList.find(a => a._id.toString() === p.project.toString()) || '';
if (p.list)
p.list = lists.find(a => a._id.toString() === p.list.toString()) || '';
})
})
return res.apiOk({ leads, count: leadsCount });
}
})
我想减少这个 api 的响应时间。欢迎任何解决此问题的想法。
解决方案
推荐阅读
- python - 如何在 Python 中显示列表或双端队列的内容?
- c# - HtmlAgilityPack 中的 SelectNodes 始终返回 null
- mule - Dataweave - 使用另一个键作为 keyName 一部分的选择器
- mongodb - $project 是否允许将文档 JSON 中给定字段的所有子字段移动到上层?
- python - 如何导入和修补与测试不同的包中的 Python 模块?
- javascript - 如何在不使用 jQuery 的情况下从 CSS 伪事件触发 JavaScript 事件?
- robotframework - 为什么 Robot Framework、Selenium2Library、Element Text Should Be 关键字无法正确验证输入元素文本?
- amazon-web-services - 使用 lambda 函数删除关联的 cloudformation 堆栈时 EMR 集群未终止
- typescript - Deno:访问控制器中的查询参数
- vue.js - 如何将 v-text-field 标签向右对齐?