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

如何在Mongoose中实现SQL的group_concat函数?(附Sequelize示例)

Sequelize group_concat 转 Mongoose 实现方案

Sequelize 里的 [Sequelize.fn('group_concat', Sequelize.col('id')), 'products'] 是实现分组后将 id 字段拼接成字符串的逻辑,对应到 Mongoose 中,需要通过 MongoDB 的聚合管道来模拟该行为,具体实现分两种场景:

场景1:MongoDB 4.4+ 版本(推荐)

MongoDB 4.4 新增了 $concatStrings 操作符,可直接将数组拼接为指定分隔符的字符串:

// 替换 YourModel 为你的 Mongoose 模型名,yourGroupField 为实际分组字段
YourModel.aggregate([
  // 按目标字段分组,收集分组内的所有 id 到数组
  {
    $group: {
      _id: "$yourGroupField",
      idList: { $push: "$id" }
    }
  },
  // 将数组转为逗号分隔的字符串,并重命名为 products
  {
    $project: {
      _id: 0, // 可选:不需要返回 _id 则设为 0
      groupField: "$_id", // 恢复分组字段的原名,按需调整
      products: { $concatStrings: { input: "$idList", separator: "," } }
    }
  }
])

场景2:兼容 MongoDB 4.4 以下版本

低版本可通过 $reduce 遍历数组完成拼接:

YourModel.aggregate([
  {
    $group: {
      _id: "$yourGroupField",
      idList: { $push: "$id" }
    }
  },
  {
    $project: {
      _id: 0,
      groupField: "$_id",
      products: {
        $reduce: {
          input: "$idList",
          initialValue: "",
          in: {
            $cond: {
              if: { $eq: ["$$value", ""] },
              then: "$$this",
              else: { $concat: ["$$value", ",", "$$this"] }
            }
          }
        }
      }
    }
  }
])

关键说明

  • 如果需要去重拼接(对应 SQL 的 group_concat(DISTINCT id)),把 $push 换成 $addToSet 即可。
  • 代码中的 yourGroupField 需要替换为你实际用于分组的字段(比如 user_id、category_id 等),若无需分组,可将 $group 的 _id 设为 null。

内容的提问来源于stack exchange,提问作者Muhammad Umer Farooq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:25:52