查询在我的 Mern 应用程序中无法正常工作

问题描述 投票:0回答:1

我正在使用 MERN 堆栈构建一个领先数据网站。用户可以根据国家、城市、职位、资历、行业、部门、电子邮件类型等各种标准过滤数据(总共超过 10 个过滤选项)。他们可以选择任何字段或字段组合来过滤数据。我已将每个请求设置为 25 条记录的限制,以保持响应的可管理性。

目前,我已经对所有字段(国家、城市、职称等)单独建立了索引,当使用单个过滤器时,数据检索快速高效。然而,当用户应用多个过滤器时,性能会显着下降——要么数据没有被正确过滤,要么结果需要很长时间才能加载。

我尝试了复合索引,这提高了特定过滤器组合的性能。但是,由于用户可以以任何随机组合应用过滤器,因此我正在努力找出优化所有潜在过滤器组合的查询性能的最佳方法。

这是我的过滤后端代码

if (Array.isArray(filters.countries)) {
        addCondition(
          "_source.person_location_country",
          "$in",
          filters.countries
        );
      }

      if (Array.isArray(excludedFilters.countries)) {
        addExclusionCondition(
          "_source.person_location_country",
          "$nin",
          excludedFilters.countries
        );
      }

      // job title
      if (Array.isArray(filters.jobTitle)) {
        addCondition("_source.person_title", "$in", filters.jobTitle);
      }

      if (Array.isArray(excludedFilters.jobTitle)) {
        addExclusionCondition(
          "_source.person_title",
          "$nin",
          excludedFilters.jobTitle
        );
      }

      // seniority
      if (Array.isArray(filters.seniority)) {
        addCondition(
          "_source.person_seniority",
          "$in",
          filters.seniority.map((s) => s.toLowerCase())
        );
      }

      if (Array.isArray(excludedFilters.seniority)) {
        addExclusionCondition(
          "_source.person_seniority",
          "$nin",
          excludedFilters.seniority.map((s) => s.toLowerCase())
        );
      }

// Apply all conditions
      if (conditions.length > 0) {
        query.$and = conditions;
      }

      if (exclusionConditions.length > 0) {
        query.$and = [...(query.$and || []), ...exclusionConditions];
      }

results = await Contacts_V5.find({
          _id: { $in: savedItemsIds },
          ...query,
        })
          .skip((page - 1) * limit)
          .limit(limit)
          .exec();

res.status(200).json({
        results
      });

我的问题是:

  1. 当用户可以应用任意过滤器组合时,如何优化 MongoDB 中的过滤查询?
  2. 我应该使用复合索引,还是有其他方法可以更有效地处理这种灵活的过滤?

在此场景中任何有关索引和优化查询性能的建议或最佳实践将不胜感激!

reactjs node.js mongodb mongoose data-modeling
1个回答
0
投票

由于用户可以随机组合应用多个过滤器,因此单个复合索引是不够的。您可以尝试根据最常用的过滤器组合动态生成复合索引。这样您就可以生成您确信用户经常使用的复合索引。

© www.soinside.com 2019 - 2024. All rights reserved.