在Next.js中用Mongoose按用户分组并计算总金额的方案
按user分组计算MongoDB中amount总和的解决方案
需求
在Next.js项目中使用Mongoose操作MongoDB,需对bonusFill集合的数据按user字段分组,计算每个用户的amount总和。
现有Schema定义
const mongoose = require('mongoose'); const { Schema } = mongoose; const bonusFillSchema = new mongoose.Schema({ user: { type: Schema.Types.ObjectId, required: true, }, amount: { type: Number, required: true, } }, { timestamps: true }); let Dataset = mongoose.models.bonusFill || mongoose.model('bonusFill', bonusFillSchema); export default Dataset;
注:修正了原Schema定义中的语法错误(多余的闭合括号)
当前查询问题
当前使用Fill.find()会返回所有原始文档,无法直接得到分组聚合后的结果:
import Fill from '../../../models/bonusFill'; const fills = await Fill.find();
解决方案
使用Mongoose的aggregate方法构建聚合管道,实现分组求和:
import Fill from '../../../models/bonusFill'; // 执行聚合查询 const aggregatedFills = await Fill.aggregate([ // 第一步:按user字段分组,计算amount总和 { $group: { _id: "$user", // 分组依据为user字段 totalAmount: { $sum: "$amount" } // 对amount字段求和 } }, // 第二步:调整输出字段,匹配期望格式 { $project: { _id: 0, // 隐藏默认生成的_id字段 user: "$_id", // 将分组的_id重命名为user amount: "$totalAmount" // 将求和结果重命名为amount } } ]); // 包装成期望的输出结构 const result = { fills: aggregatedFills };
最终输出结果
{ "fills": [ { "user": "631ce46b9bed2e97ba77a0a3", "amount": 220 }, { "user": "632ce66b9bqd2e97baa795a4", "amount": 50 } ] }
内容的提问来源于stack exchange,提问作者Shahriyor Sharifjonov
相关产品推荐
相关产品推荐

