Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 构建聚合结果的总和_Javascript_Mongodb_Typescript_Mongoose_Aggregation Framework - Fatal编程技术网

Javascript 构建聚合结果的总和

Javascript 构建聚合结果的总和,javascript,mongodb,typescript,mongoose,aggregation-framework,Javascript,Mongodb,Typescript,Mongoose,Aggregation Framework,是否可以在聚合结果中添加字段?我的目标是得到所有结果的总和。目前,我只是减少了结果,但我认为这不如通过查询来解决它 aggregate([ { $match: { time: { $gte: start, $lte: end }, }, }, { $group: { _id: { $dateToString: { format: '%Y-%m-%d'

是否可以在聚合结果中添加字段?我的目标是得到所有结果的总和。目前,我只是减少了结果,但我认为这不如通过查询来解决它

aggregate([
      {
        $match: {
          time: { $gte: start, $lte: end },
        },
      },
      {
        $group:
          {
            _id: { $dateToString: { format: '%Y-%m-%d', date: '$time' } },
            totalAmount: { $sum: '$payment.amount' },
          },
      },
    ]).exec().then((result) => {
      return {
        total: result.reduce(((acc, curr) => acc + curr.totalAmount), 0),
        dates: result,
      };
    });
结果是:

{
   "_id":"2020-06-06",
   "totalAmount":12
},
{
   "_id":"2020-07-06",
   "totalAmount":12
}
你知道我怎样才能得到所有的总金额吗,看起来像这样,但没有减少的部分

{
    "total": 24,
    "dates": [
        {
            "_id": "2020-06-06",
            "totalAmount": 12,      
        },
        {
            "_id": "2020-07-06",
            "totalAmount": 12,    
        }
    ]
}

您可以同时使用两个查询

const [result, totalAmount] = await Promise.all([
  Model.aggregate([
    { $match: { time: { $gte: start, $lte: end } } },
    {
      $group: {
        _id: { $dateToString: { format: "%Y-%m-%d", date: "$time" } },
        totalAmount: { $sum: "$payment.amount" },
      }
    },
  ]),
  Model.aggregate([
    { $match: { time: { $gte: start, $lte: end } } },
    {
      $group: {
        _id: null,
        totalAmount: { $sum: "$payment.amount" },
      }
    },
  ])
])

return {
  total: result,
  dates: totalAmount,
}
或者可以使用
$facet

const result = await Model.aggregate([
  { $match: { time: { $gte: start, $lte: end } } },
  {
    $facet: {
      result: [
        {
          $group: {
            _id: {
              $dateToString: { format: "%Y-%m-%d", date: "$time" },
            },
            totalAmount: { $sum: "$payment.amount" },
          },
        },
      ],
      totalAmount: [
        {
          $group: {
            _id: null,
            totalAmount: { $sum: "$payment.amount" },
          },
        },
      ],
    },
  },
]);


return {
  total: _.get(result, "[0].result", []),
  dates: _.get(result, "[0].totalAmount.totalAmount", 0),
}