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),
}