【问题标题】:How to Implement SUM() function of SQL in cloud Firestore如何在 Cloud Firestore 中实现 SQL 的 SUM() 函数
【发布时间】:2018-01-19 11:46:50
【问题描述】:

我将用户的分数存储在 google cloud firestore 中,因为每个分数都会在名为“points”的集合中创建一个新文档。

集合名称:积分

  • document1: {id:111,userid:345,value:50}
  • document2:{id:222,userid:345,value:70}
  • document3:{id:333,userid:345,value:30}
  • document1:{id:444,userid:345,value:100}

我想对 value 字段中的所有值求和。

我用谷歌搜索了很多次,但一无所获。 sum() 是否有任何替代方法或任何其他方式来实现用户的记录分数?

【问题讨论】:

    标签: sum google-cloud-firestore


    【解决方案1】:

    Cloud Firestore 中没有内置聚合运算符。

    简单的解决方案是在客户端加载数据并在其中求和,但这意味着您(和您的用户)每次需要显示总和时都要承担加载所有文档的费用。

    更好的方法是在数据库中保留一个所谓的运行总计,每当将文档写入(添加、修改、删除)到“points”集合时,您都会更新它。为此,您有两个选择:从客户端执行,或从受信任的环境(例如 Cloud Functions)执行。 Firestore documentation on aggregation queries 描述了这两个选项并显示了示例代码。

    【讨论】:

      【解决方案2】:

      您可以使用 forEach 或在 for 循环中进行迭代。 This 堆栈溢出的答案可能会有所帮助。 下面是一个相同的例子:

      for (var i in querySnapshot.docs) {
          const doc = querySnapshot.docs[i]
          //do what you want to here
      }
      

      ---或---

      你可以像this一样使用forEach

       const collRef = firebase.firestore().collection('todos');
        const query = collRef.orderBy('position');
        const items = query.get()
          .then((snapshot) => {
            let newCount = 0;
            snapshot.forEach((doc) => {
              const docRef = collRef.doc(doc.id);
              docRef.update({ position: newCount });
              newCount += 1;
            });
          });
      

      【讨论】:

        【解决方案3】:

        使用云功能,它会为您创建一个网址。

        例子:

        import { Request, Response } from 'express'
        import * as admin from 'firebase-admin'
        import * as functions from 'firebase-functions'
        
        export const getUsersCount = functions.runWith({ memory: '2GB', timeoutSeconds: 60 }).https.onRequest(async (req: Request, res: Response) => {
        
            const allUsers = await admin
            .firestore()
            .collection('users')
            .get()
            const numberOfUsers = allUsers.size;
        
        
            res.status(200).json({
                allTimeUsers: numberOfUsers,
            })
            return true;
        })
        

        然后只需执行 Firebase deploy --only functions:getUsersCount 日志将为您打印出 url。如果它是一个大应用程序,该 url 可能需要一段时间才能加载。

        【讨论】:

          猜你喜欢
          • 2019-09-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多