我在谷歌云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;
});
});