如何从文档中获取特定字段值

时间:2020-09-28 09:18:24

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

我正在尝试使用Firestore从集合文档中获取值。

这是我的代码和控制台日志:

 useEffect(() => {
    let totalarray = [];
   firebase.firestore().collection("users").doc(uid).collection("services").get().then((snapshot) => {
     snapshot.forEach((doc) => {
       const obj = doc.data();
       //obj.forEach((data) => totalarray.push((data)) )
      console.log("------->",obj);
     })
   })
  }, [])

这是我的控制台日志:

Console Log

我的目标是获取每个文档的每个“ serviceCost”字段的值,将其求和,然后将其放在全局变量中供我使用。

2 个答案:

答案 0 :(得分:0)

如果您只想获取Firestore文档的某些部分,则不能。您必须阅读整个文档,然后在客户端进行计算。其他方法,您可以考虑创建另一个集合,例如“总计”。该集合将由Firebase函数填充,该函数将在创建文档时调用并计算新成本,然后将其添加到集合“总计”中

答案 1 :(得分:0)

以下应该可以解决问题:

firebase.firestore().collection("users").doc(uid).collection("services").get().then((snapshot) => {
         let serviceCostTotal = 0;
         snapshot.forEach((doc) => {
           serviceCostTotal = serviceCostTotal + parseInt(doc.data().serviceCost, 10);
         })
         // Do whatever you want with serviceCostTotal
    });

您需要遍历查询返回的所有文档,并对字段值求和。请注意,它存储为字符串,因此您需要将其转换为数字。

我假设serviceCost的值始终是整数。如果它们是浮点数,建议在汇总时使用Big.js之类的库。


但是请注意,使用这种方法时,每次您要计算总和时,都会为用户读取整个services子集合,这可能会很昂贵,具体取决于该子集合中Firestore文档的数量。正如Methkal Khalawi在他的回答中所建议的,您可以在其他Firestore文档中维护一个“外部”总和。看一下Distributed Counters concept,以获取启发性的解决方案。