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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:40:28