Помимо ошибки, которую вы возвращаете data
, а не info
, поскольку .aggregate()
принимает массив, вы можете динамически формировать массив. (.filter(Boolean)
- это идиома для удаления ложных предметов, в данном случае null
s.
getRevenue = async sel => {
const years = sel.selectedYear.split(",").map(Number).filter(Boolean);
const products = sel.selectedProduct.split(",").filter(Boolean);
const aggregate = [
{ $match: { AccountName: sel.selectedAccount } },
{ $unwind: "$data" },
years.length ? { $match: { "data.Year": { $in: years } } } : null,
products.length ? { $match: { "data.Name": { $in: products } } } : null,
{ $group: { _id: "$_id", data: { $push: "$data" } } },
].filter(Boolean);
var data = await mongoose.model("revenues").aggregate(aggregate);
return {
revenue: getSum(data[0].data, "Value"),
volume: getSum(data[0].data, "Volume"),
};
};