如何在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
相关产品推荐
相关产品推荐

