我有2个Mongoose系列:ExpenseCategory和Expense
var ExpenseCategorySchema = new Schema({
name: String,
totalSpentInThisMonth: Number
});
mongoose.model('ExpenseCategory', ExpenseCategorySchema);
var ExpenseSchema = new Schema({
expenseCategoryId: {type: Schema.Types.ObjectId, ref: 'ExpenseCategory'},
amount: Number,
date: Date
});
mongoose.model('Expense', ExpenseSchema);
在 Node.js 中写入 GET api
调用以返回所有 ExpenseCategory items
.
appRouter.route('/expensecatgories')
.get(function(req, res){
ExpenseCategory.find({}, function (expenseCategories) {
res.json(expenseCategories);
});
});
在上面 GET method
我希望在返回之前填充每个 expenseCategories
项目中的字段 totalSpentInThisMonth
. 此字段需要计算为所有 expense.amount
的总和,其中 expense.expenseCategoryId
与 expenseCategory.id
匹配, expense.date
在当月 .
如何在返回 expenseCategories
之前填充 totalSpentInThisMonth
字段?
1 回答
使用聚合框架中的 .aggregate() 方法 . 您需要首先构造日期以用作日期范围在当前月份内的文档的日期范围查询,因此您需要计算月份日期对象的第一天和最后几天 . 这些日期将在 $match 管道中用于过滤掉当前月份以外的文档 .
下一个管道流将是 $group 阶段,它通过
expenseCategoryId
键对传入文档进行分组,以便您可以使用累加器运算符 $sum 计算当前月份的总花费 .以下代码实现了以上内容: