【问题标题】:calculate sum of income with Firestore用 Firestore 计算收入总和
【发布时间】:2020-10-19 17:11:32
【问题描述】:

我正在尝试从 Firestore 计算 serviceCost 的总和。我设法获取了所有文档,但查询似乎只计算了给定月份输入的第一个成本。

代码:

firebase
  .firestore()
  .collection("users")
  .doc(uid)
  .collection("confirmed-appointments")
  .get()
  .then((querySnapshot) => {
      let serviceCostTotal = 0; //Will hold currentMonth Total Income.
      let monthNumber = 0;
      let array = [];
      querySnapshot.forEach((doc) => {
        monthNumber = parseInt(doc.data().month, 10);
        serviceCostTotal =
          serviceCostTotal + parseInt(doc.data().serviceCost, 10); //Calculate Total Month income using this formula
        array[monthNumber - 1] = serviceCostTotal; //Push the income of month X to array in X place
        serviceCostTotal = 0; // after pushing, initialize the sum to 0
      });

例如: 我想计算第 10 个月的总 serviceCost。

Firestore 如下所示:

在循环中,我试图获取每个文档的serviceCost,并将其推送到数组[monthNumber]。

问题是:如果我有 2 个文档,它们的值是相同的 "month: xx" ,则循环仅计算第一个文档的 serviceCost 值。 这意味着如果我的总和需要为 6000,则只需 2500。

它只计算这个:

虽然我也有这个:

【问题讨论】:

  • 你现在拥有的有什么问题?请编辑问题以清楚说明哪些内容未按您期望的方式工作,以及您是如何观察到的。我们应该能够获取您的代码和数据并为自己复制。
  • 已编辑,希望您能理解

标签: javascript react-native google-cloud-firestore


【解决方案1】:

您明确地覆盖了每个元素。尝试添加它。

array[monthNumber - 1] = serviceCostTotal

// Should be
array[monthNumber - 1] = (array[monthNumber - 1] || 0) + serviceCostTotal

编辑: 正如其他人所说,此代码有效


  let monthNumber = 0;
  let array = [];
  [{ month: 1, serviceCost: 15 },
  { month: 1, serviceCost: 4 },
  { month: 1, serviceCost: 9 },
  { month: 2, serviceCost: 1 },
  { month: 3, serviceCost: 100 }].forEach((doc) => {
    monthNumber = parseInt(doc.month, 10);
    serviceCostTotal =
      serviceCostTotal + parseInt(doc.serviceCost, 10); //Calculate Total Month income using this formula
    array[monthNumber - 1] = (array[monthNumber - 1] || 0) + serviceCostTotal; //Push the income of month X to array in X place
    serviceCostTotal = 0; // after pushing, initialize the sum to 0
  });
  console.log(array);

您必须向我们展示您如何验证这一点以及实际的输入和输出是什么。

【讨论】:

  • 还是一样的结果 :(
【解决方案2】:

正如你所说,你已经在数组索引中有数据,所以你可以这样做

const querySnapshot = [{
  month: 10,
  serviceCost: 2500
}, {
  month: 10,
  serviceCost: 3500
}, {
  month: 11,
  serviceCost: 1000
}];

const array = [];
querySnapshot.forEach((doc) => {
  const monthNumber = parseInt(doc.month, 10);
  array[monthNumber - 1] = (array[monthNumber - 1] || 0) + parseInt(doc.serviceCost, 10);
});

console.log(array);

您基本上检查该月的索引中是否有某些东西并添加它或使用您计算的 serviceCostTotal

【讨论】:

  • 我仍然得到相同的结果,这很奇怪。我需要删除 serviceCostTotal = 0 吗?
  • 它只有第一个值吗?
  • 我做了一个 sn-p,它应该可以工作,我只是删除了 data() 部分
  • 我试过了,没有结果:(
  • 实际上更新了我的截图,你必须在月份和 serviceCost 中添加 data() 部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2020-06-28
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多