【问题标题】:How to write to all documents in a Firestore collection using Cloud Functions?如何使用 Cloud Functions 写入 Firestore 集合中的所有文档?
【发布时间】:2019-11-16 16:08:24
【问题描述】:

我们正在开发一个使用 Firebase Firestore 的应用。每天午夜,我们希望为集合中的每个 User 文档将 counter 属性的值设置为 1

云函数似乎是一个合理的选择,我们很快找到了一种调度云函数的方法:

exports.incrementCounterNightly = functions.pubsub.schedule('0 0 * * *')
  .timeZone('Europe/London')
  .onRun((context) => {
  console.log('This will be run every day at 00:00 AM London Time!');
});

我们要写入的文档的路径是 collections/users/*。

我们的问题是:

  • 在 Cloud Functions 中实现这一目标的最佳方法是什么?
  • 这是 Cloud Functions 可以适当实现的吗?
  • 这是可扩展的吗?如果用户集合增长到 100,000 甚至 5,000,000 个文档怎么办?

非常感谢,

埃德

【问题讨论】:

  • 计数器是做什么的?它算什么?目前这是不可扩展的。部分是由于编程限制,但主要是由于成本。写入相对昂贵,因此写入 1,000,000 个用户文档需要花费。如果你能解释你想用计数器做什么,那么可能会有更好的方法。
  • 快速编辑上述评论。每天开始时 5,000,000 次写入将花费您每天大约 900,000 美元。 ???所以是的,写入很昂贵。
  • 嘿@Fogmeister,感谢您的快速响应。我们正在使用一个约会应用程序,这个计数器基本上跟踪用户有多少可用的“超级喜欢”。我曾考虑过理论上这可以在设备上本地跟踪,但在服务器上保留一个表示也很好 - 用于客户支持等。也感谢强调成本 - Firestore 的一个非常重要的考虑因素!是的,正如预期的那样敲诈勒索! ??????
  • 顺便说一句,我不知道是怎么回事,但我误读了定价(我认为这听起来有点贵),但它是每 100,000 次写入 0.18 美元。所以每天9美元。哈哈!略有不同,但如果您不想每月花费数百美元,差异仍然很大。

标签: google-cloud-firestore google-cloud-functions


【解决方案1】:

由于成本和编程限制,我认为您应该考虑以不同的方式构建数据。

您可以为您的用例做的不仅仅是存储每个用户使用的“超级赞”的原始计数,还可以将每日超级赞存储在单独的文档中并附上日期。

因此,如果您想查询用户今天使用了多少超级喜欢,您可以查询用户“超级喜欢”子集合。有一个文档,其中包含最后一个超级赞的日期以及使用了多少。

所以当查询他们今天使用了多少时...获取文档,如果它有不同的日期然后 0(因为它不是今天的日期)如果它有今天的日期然后查看计数。

然后,当用户使用 superlike 时,您可以返回该文档。将计数设置为 1,将日期设置为今天的日期。或者只是增加日期的计数已经是今天。

如果您对我试图解释的内容有任何疑问,请告诉我。

【讨论】:

  • 不同的数据结构听起来是个好主意,我喜欢所描述的解决方案。您的回答让我想知道它是否可以进一步简化 - 只需在用户上拥有一个“lastSuperlikeTimestamp”属性,每次用户“超级喜欢”另一个时更新。如果这不能转换为当前日期,则可以使用 superlike。如果以后,我们希望人们能够购买更多的超级喜欢,则可以将其存储在不同的属性“paidSuperlikes”中,购买时只需读取该属性即可。想法?非常感谢您的帮助。
  • 是的,我在写答案时也在考虑类似的事情。作为一种可能的选择。绝对值得探索。
猜你喜欢
  • 2021-03-27
  • 2018-09-16
  • 2021-05-06
  • 2021-05-09
  • 1970-01-01
  • 2021-01-08
  • 2021-03-16
  • 1970-01-01
  • 2020-04-16
相关资源
最近更新 更多