JavaScript中按ID分组求和不同对象数值的技术问题
使用Mongoose Aggregate实现按_id分组求和value
直接用Mongoose的aggregate()方法就能搞定,核心是通过$group阶段按_id分组,再用$sum累加对应value值,具体实现如下:
代码示例
假设你的数据模型为YourModel,执行以下聚合操作:
YourModel.aggregate([ { $group: { _id: "$_id", // 按_id字段分组 totalValue: { $sum: "$value" } // 累加每组的value值 } }, { $project: { id: "$_id", // 将分组后的_id重命名为id,匹配期望输出格式 value: "$totalValue", _id: 0 // 隐藏默认的_id字段 } } ]) .then(result => { console.log(result); }) .catch(err => { console.error(err); });
执行结果
针对你提供的示例数组,执行后会得到符合预期的结果:
[ { id: "123456", value: 55 }, { id: "123456789123456789", value: 12 } ]
关键阶段说明
$group:按_id对文档进行分组,$sum操作符会自动累加同组内的value值。$project:用于调整输出结构,把分组后的_id重命名为id,将累加结果映射为value,同时隐藏原始的_id字段。
如果是直接处理内存中的数组(而非从MongoDB查询数据),也可以用JavaScript原生的reduce方法实现:
const array = [ { _id: "123456", value: 30 }, { _id: "123456789123456789", value: 12 }, { _id: "123456", value: 25 }, ]; const result = Object.values(array.reduce((acc, item) => { if (!acc[item._id]) { acc[item._id] = { id: item._id, value: 0 }; } acc[item._id].value += item.value; return acc; }, {})); console.log(result);
内容的提问来源于stack exchange,提问作者Weslley Fortunato
相关产品推荐
相关产品推荐

