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

MongoDB聚合$match多条件配置问题:SQL转查询返回空数组

SQL转MongoDB问题修复

原有代码错误点

  • $match阶段存在逻辑错误:JS对象中同名键会被后者覆盖,先后编写的两个$and键会导致第一个匹配2021年12月的条件直接失效;且条件拼接完全不符合原SQL的OR优先级规则,最终生效条件变成「2022年1月 且 manager匹配指定邮箱」,匹配范围和需求不符就会返回空数组。
  • $group阶段分组维度错误:仅按month单字段分组,和原SQL要求的year、month联合分组规则不符,且没有配置计数累加器,无法统计invoiceNo数量。
  • $project阶段字段引用错误:聚合分组后所有维度字段都收纳在_id或累加器中,直接写month:1、year:1无法取到对应值。

正确聚合查询代码

const getNoOfOrders = await BattlefieldInfo.aggregate([
  {
    $match: {
      $or: [
        // 第一个条件分支:year=2021 且 month='Dec',无manager限制
        {
          year: periodDate[0]['year'],
          month: periodDate[0]['month']
        },
        // 第二个条件分支:year=2022 且 month='Jan' 且 manager匹配指定邮箱
        {
          year: prevYear,
          month: prevMonth,
          manager: email
        }
      ]
    }
  },
  {
    $group: {
      // 按year、month、manager做复合分组,对齐SQL分组+返回字段要求
      _id: {
        year: '$year',
        month: '$month',
        manager: '$manager'
      },
      // 统计每组invoiceNo非空的数量,对应count(invoiceNo)逻辑
      'count(invoiceNo)': {
        $sum: {
          $cond: [{ $ne: ['$invoiceNo', null] }, 1, 0]
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      'count(invoiceNo)': 1,
      manager: '$_id.manager',
      year: '$_id.year',
      month: '$_id.month'
    }
  }
]);

逻辑说明

  • 修正后的$match严格对齐SQL的WHERE优先级,用$or包裹两个独立的AND条件分支,不会出现键覆盖、条件互斥的问题。
  • 如果不需要排除invoiceNo为空的记录,可以把计数逻辑简化为'count(invoiceNo)': { $sum: 1 },统计效率更高。
  • 返回结构完全匹配预期表格格式,字段顺序和名称和示例一致。

内容的提问来源于stack exchange,提问作者Yevgeniy Bagackiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.18 16:15:44