【问题标题】: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 可能需要一段时间才能加载。