使用 GCF/pubsub 更新 Firestore 文档中的计数器

Posted

技术标签:

【中文标题】使用 GCF/pubsub 更新 Firestore 文档中的计数器【英文标题】:Update counter in a Firestore document with GCF/pubsub 【发布时间】:2021-07-20 16:46:34 【问题描述】:

我有客户在 PubSub 上发布消息,GCF 触发接收到的每条消息,从而编辑我的 firestore 中的文档。该文档包含一个 id、一个房间的名称以及该房间内的当前人数。 GCF 增加当前数量。

但我认为,如果同一房间同时有两条消息,gcf 将无法完成正确的工作,我的文档不会有最后的 +2 吗?

基本上,GCF 获取文档,并增加当前数量。

如何处理同一房间同时到达的多条消息?

【问题讨论】:

“同一时间”不清楚。您需要一个时间窗口来对同一消息进行重复数据删除。是你需要的吗? 感谢您的回答。不是真的,我承认两个客户会“同时”进入同一个房间并点击按钮。两条消息到达 PubSub 并触发两个 GCF。他们获得相同的文档,并在此文档中添加 +1。我的文档中只有 +1,但我应该有 +2。 好的,你想要+2;不是+1,所以不是重复数据删除。明白了。您是否尝试与 Firestore 进行交易?无论如何,你每秒有多少条消息? 【参考方案1】:

通过使用FieldValue.increment(),您可以确保该字段将正确递增。正如此 Firebase 博客 article 中所解释的,“使用 FieldValue.increment(),数据库将立即根据它所具有的任何值进行更改”。

在 Cloud Function for Firebase 中,执行以下操作:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const FieldValue = require('firebase-admin').firestore.FieldValue;


exports.scheduledFunction = functions.pubsub.schedule('...').onRun(async (context) => 
  // ...
  await admin.firestore().collection("...").doc("...").update( nbrOfPeople: FieldValue.increment(1) );
  // ...
  return null;
);

【讨论】:

谢谢,这正是我想要的。它可以处理最大值吗? “它可以处理最大值”你到底是什么意思? ***.com/questions/62459721/… 嘿@kmalki,如果它回答了您的问题,请接受我的回答。见***.com/help/someone-answers.Thanks @RenaudTarnec 这仍然受到 1 次写入/第二次限制,对吧?我的意思是,在使用增量时,我们还需要确保文档每秒更新一次以上,对吧?

以上是关于使用 GCF/pubsub 更新 Firestore 文档中的计数器的主要内容,如果未能解决你的问题,请参考以下文章

如何为从 Firestore 填充的 RecyclerView 实现过滤器?

获取 Firestore 子集合

如何解决这些问题? “无法反序列化对象。”

如何判断用户是关闭浏览器标签还是刷新页面

我的 flatList 在我的 api 查询完成之前呈现

初始化对象以显示在我的脚手架中