You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含$unwind的MongoDB查询过慢,如何优化查询与数据结构?

MongoDB大集合下companyissue统计查询优化方案

一、无需全量$unwind的高效查询实现

针对5000万级别的大集合,原查询因全量$unwind展开数组导致性能瓶颈,可通过先去重再展开的方式大幅降低计算量,优化后的聚合语句如下:

db.collection.aggregate([
  // 提前过滤无效文档,利用索引减少后续处理数据量
  { $match: { rejected: 0, "keyword.companyissue": { $ne: null } } },
  // 对单文档内的companyissue去重,仅保留非null的唯一值
  {
    $project: {
      uniqueCompanys: {
        $reduce: {
          input: "$keyword",
          initialValue: [],
          in: {
            $cond: [
              { $and: [
                { $ne: ["$$this.companyissue", null] },
                { $not: { $in: ["$$this.companyissue", "$$value"] } }
              ] },
              { $concatArrays: ["$$value", ["$$this.companyissue"]] },
              "$$value"
            ]
          }
        }
      }
    }
  },
  // 展开去重后的精简数组(仅处理必要条目)
  { $unwind: "$uniqueCompanys" },
  // 按companyissue分组统计出现次数
  {
    $group: {
      _id: "$uniqueCompanys",
      count: { $sum: 1 }
    }
  },
  // 按统计数降序排列
  { $sort: { count: -1 } }
])

优化逻辑说明:

  1. 前置过滤:通过$match提前排除rejected=1或companyissue=null的文档,直接利用已建的keyword.companyissue索引减少数据扫描范围。
  2. 单文档去重:用$reduce对每个文档的keyword数组去重,避免同一文档内重复的companyissue被多次统计,同时减少后续$unwind的条目数。
  3. 轻量展开分组:仅展开去重后的精简数组,后续分组计算的压力大幅降低。

二、长期优化:调整数据结构

若此类统计为高频操作,建议通过以下方式从数据结构层面彻底解决性能问题:

1. 预聚合统计集合

维护一个独立的company_issue_stats集合,在原文档写入/更新时同步更新该集合的统计数据:

  • 写入原文档时,提取所有companyissue值,对company_issue_stats执行$inc操作累加计数(需注意同一文档内的去重)。
  • 查询时直接从company_issue_stats读取结果,无需复杂聚合,性能接近实时查询。

2. 拆分数组为独立集合

将原文档中的keyword数组拆分为单独的article_keywords集合,每条记录对应一个关联关系:

// article_keywords集合示例
{
  "articleid": "166494143",
  "companyissue": "Apple",
  "clientid": "M0036",
  "rejected": 0
}

此时统计查询可直接高效执行:

db.article_keywords.aggregate([
  { $match: { rejected: 0 } },
  { $group: { _id: "$companyissue", count: { $sum: 1 } } },
  { $sort: { count: -1 } }
])

针对该集合建立{rejected:1, companyissue:1}复合索引,可实现毫秒级的统计查询,完全适配超大集合场景。

内容的提问来源于stack exchange,提问作者Utsav Upadhyay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:54:54