首页 文章

Mongoose:从其他集合中填充集合中的字段

提问于
浏览
0

我有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.expenseCategoryIdexpenseCategory.id 匹配, expense.date 在当月 .

如何在返回 expenseCategories 之前填充 totalSpentInThisMonth 字段?

1 回答

  • 0

    使用聚合框架中的 .aggregate() 方法 . 您需要首先构造日期以用作日期范围在当前月份内的文档的日期范围查询,因此您需要计算月份日期对象的第一天和最后几天 . 这些日期将在 $match 管道中用于过滤掉当前月份以外的文档 .

    下一个管道流将是 $group 阶段,它通过 expenseCategoryId 键对传入文档进行分组,以便您可以使用累加器运算符 $sum 计算当前月份的总花费 .

    以下代码实现了以上内容:

    appRouter.route('/expensecatgories').get(function(req, res){
        var today = new Date(), y = today.getFullYear(), m = today.getMonth();
        var firstDay = new Date(y, m, 1);
        var lastDay = new Date(y, m + 1, 0);
        var pipeline = [
            {
                "$match": {
                    "date": { "$gte": firstDay, "$lt": lastDay }
                }
            },
            {
                "$group": {
                    "_id": "$expenseCategoryId",
                    "totalSpentInThisMonth": { "$sum": "$amount" }
                }
            }
        ];
    
        Expense.aggregate(pipeline, function (err, result){     
            if (err) throw err;
            var categories = result.map(function(doc) { return new ExpenseCategory(doc) });
            Expense.populate(categories, { "path": "expenseCategoryId" }, function(err, results) {
                if (err) throw err;
                console.log(JSON.stringify(results, undefined, 4 ));
                res.json(results);
            });
        });        
    });
    

相关问题