Meteor ReactiveAggregate

Ram*_*ali 5 mongodb meteor

我想为Transactions集合创建流星反应聚合.

交易有日期,所以我想按月汇总数据.

代码是:

ReactiveAggregate(this, Transactions, [
    {
      $match: {
        'date': {
          $gte: new Date(startDate),
          $lt: new Date(endDate)
        }
      }
    },
    {
      '$group' :
      {
        '_id' : { month: { $month: "$date" }},
        'totalProfit': { $sum: "$totalProfit"},
        'totalSales': { $sum: "$totalSales" },
        'totalExpenses': { $sum: "$totalExpenses" },
        count: { $sum: 1 }
      }
    },
    {
      '$project':{
        date: '$date',
        totalProfit: '$totalProfit',
        totalSales: '$totalSales',
        totalExpenses: '$totalExpenses',
      }
    }
  ], { clientCollection: "report3MonthsTransactions" });

});
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它会提示错误:

错误:Meteor当前不支持ObjectID以外的对象作为ID

谢谢!

Mas*_*rAM 2

你的$group条款是:

'$group' : {
  '_id' : { month: { $month: "$date" }},
  ...
}
Run Code Online (Sandbox Code Playgroud)

这导致每个文档都有一个复合_id: {_id: {month: <someMonth>}, ...},其中每个_id都是一个实际上不是ObjectID.

对于你的情况,拥有{_id: <someMonth>, ...}就足够了。

这可以通过将其分组来实现,如下所示:

'$group' : {
  '_id' : { $month: "$date" },
  ...
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您需要将 the_id作为字符串(我认为您这样做),您可以使用$substr它来转换它:

'$group' : {
  _id: {$substr: [{$month: '$date'}, 0, 2]},
  ...
}
Run Code Online (Sandbox Code Playgroud)