Как динамически добавлять условия совпадения в mongoDB? - PullRequest
0 голосов
/ 04 февраля 2020

Вот мой код, теперь я хотел условно добавить поля года и имени. как этого добиться?

getRevenue = async sel => {
  var years = sel.selectedYear.split(",").map(Number);
  var data = await mongoose
    .model("revenues")
    .aggregate([
      { $match: { AccountName: sel.selectedAccount } },
      { $unwind: "$data" },
      { $match: { "data.Year": { $in: [...years] } } },
      { $match: { "data.Name": { $in: [sel.selectedProduct.split(",")] } } },
      { $group: { _id: "$_id", data: { $push: "$data" } } },
    ]);
  var info = {};
  info.revenue = getSum(data[0].data, "Value");
  info.volume = getSum(data[0].data, "Volume");
  return data;
};

1 Ответ

0 голосов
/ 04 февраля 2020

Помимо ошибки, которую вы возвращаете 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"),
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...