【发布时间】:2021-09-11 05:01:58
【问题描述】:
应用程序的概念很简单,我会跟踪某个商品的价格,并在达到用户想要的价格点时推送通知。
商品的价格(ActualPrice)通过每隔几秒更新一次的 Firebase 实时数据库字段反映出来。
用户及其请求的价格 (RequestedPrice) 保存在 Firestore 文档中,每个文档都有两个字段:
- 价格
- FCM 令牌
令牌是一个 FCM 令牌,用于向设备推送通知。
在 Firebase Cloud Functions 中,我有一个侦听器,它会在 ActualPrice 每隔几秒通过 .onWrite() 函数发生变化时触发。然后,它交叉比较所有用户的价格,并仅将通知推送给满足 RequestedPrice 的用户。
问题在于,此事件被频繁触发,因此达到价格的用户每隔几秒钟就会收到通知。
我的一个想法是向用户 Firestore 文档添加一个字段,并在用户已经收到通知或尚未收到通知时更新它。唯一的问题是您无法通过 Firebase 函数更改文档字段。
如果您有任何想法,我将不胜感激。
编辑:
const UIDRef = db.collection("/Currency/UserIDs");
const snapshot = await UIDRef.where("Price", ">=", RTDPrice).get();
snapshot.forEach(doc => {
const Temp = {
Status: 'Los Angeles',
};
doc.set(Temp);
【问题讨论】:
-
"唯一的问题是您无法通过 Firebase 函数更改文档字段。"为什么不?这实际上听起来像我会采用的解决方案,要么将您已经通知的人的信息存储在文档中,要么存储在实时数据库中。
-
@FrankvanPuffelen 据我所知,您只能通过“.add”添加文档,没有向现有文档添加字段的功能。
-
.add()适用于 COLLECTIONS,您正在寻找适用于 DOCUMENTS 的docRef.set(data, {mergeoption:true})、docRef.update(data)- firebase.google.com/docs/reference/js/… -
const UIDRef = db.collection("/Currency/UserIDs");const snapshot = await UIDRef.where("Price", ">=", RTDPrice).get();snapshot.forEach(doc => { docs.set({Temp: 'Sent'}, {mergeoption:true}); });我试过实现这个,虽然我不确定我哪里出错了。 @LeadDreamer -
如果您在问题代码中使用
doc.update(Temp)会怎样?
标签: node.js firebase google-cloud-firestore google-cloud-functions firebase-cloud-messaging