如何在云火堆中实现 SQL 的 SUM() 函数



我在谷歌云Firestore中存储了一个用户的分数,因为每个分数都是集合中一个名为">points"的新文档。

集合名称:积分

  • 文档 1: {id:111,用户 ID:345,值:50}
  • 文档2:{id:222,用户 ID:345,值:70}
  • 文档3:{id:333,用户ID:345,值:30}
  • 文档 1:{id:444,用户 ID:345,值:100}

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

我谷歌过很多次,但一无所获。sum(( 是否有任何其他方法可以实现记录用户的分数?

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

天真的解决方案是在客户端中加载数据并将其相加,但这意味着您(和您的用户(每次需要显示总和时都会产生加载所有文档的成本。

更好的方法是在数据库中保留所谓的运行总计,每当文档写入(添加、修改、删除(到"points"集合时,您都会更新该总计。为此,您有两种选择:从客户端执行此操作,或从受信任的环境(例如云函数(执行此操作。有关聚合查询的 Firestore 文档介绍了这两个选项并显示了示例代码。

使用云函数,它将为您创建一个URL。

例:

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日志将为您打印出网址。如果网址是一个大型应用程序,则可能需要一段时间才能加载。

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

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

---或---

你可以像这样使用每个

 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;
      });
    });

最新更新