首页 > 解决方案 > 填充更多的猫鼬集合字段导致节点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 的响应时间。欢迎任何解决此问题的想法。

标签: node.jsmongodbmongooseresponse-time

解决方案


推荐阅读