当前位置: 首页 > 知识库问答 >
问题:

Angular Firebase firestore-对文档的内部订阅在初始订阅时返回两个值

慕俊语
2023-03-14

我正在使用AngularFire作为Angular11上firebase的API。

我的应用程序的域名是实时拍卖

理想情况下,我想做的是阅读所有文档,然后订阅每个文档以进行更改。

我目前的问题是我在firestore上的阅读次数。

我的收藏阅读将产生N次阅读。但订阅每个文档会产生额外的读取,因此默认情况下会有2N次读取,这似乎是不可避免的。

但我想这比在集合上留下订阅并在每次更新集合中的内容时接收N次读取要好。

因此,使用下面的示例代码,我对collection进行查询,然后对文档进行另一次查询。仅为复制而简化。

  this.store.collection("users").valueChanges()
  .pipe(
    take(1),
    concatMap(() => this.store.doc("user/1").valueChanges())
  )
  .subscribe(console.log(user));

然而,内部可见光将发射2次。

一次使用添加,一次使用修改快照更改类型。

所以我的问题是:

为什么我的内部可观测对象在初始订阅时连续发射两次,而在我看来它应该只发射一次。

如果这两个发出的都被算作是firest上的读取,这将产生3N个读取。

通过我在firestore监控页面上的测试,情况似乎是这样的,因为在400文档页面上,我在firestore上记录了大约1200次读取,并计入了定价。

>

是否有人对如何以更少的读取量更高效地检索数据提出建议?

我是否应该切换到RTDB,因为RTDB似乎提供了更为慷慨的10GB数据输出,这对我的读取量来说可能更好?

编辑:

所以我刚刚用AngularFireAPI测试了firebase RTDB。

像上面这样的示例代码将使内部observable只按预期发出1个值,并且每个项目更改1个值。这是意料之中的。

我仍然不清楚为什么fiRecovery实现会发出2个值,这两个值都算作读取并带走定价。

最终代码如下所示:

this.db.list<AuctionItem>(`auctions/1/items`)
.valueChanges()
.pipe(
  take(1),
  tap(items => this.itemsToRender = items),
  mergeMap(items => [...items]),
  mergeMap((item: AuctionItem) => this.db.object(`auctions/1/items/${item.id}`).valueChanges() as Observable<AuctionItem>),
)
.subscribe(change => {
  // do work when item updates
})

仍然不知道为什么firestore没有像预期的那样为我工作。考虑使用部分firestore RTDB以实现最佳使用,因为即使有50k的空闲空间,firestore上的读取量也会很高。

共有1个答案

骆英纵
2023-03-14

这是我在你的情况下会做的:

  1. 执行onSnapshot()查询,(第一次读取操作)--

侦听更改时,您只会对确实更改的文档再次收费,而不是您已经查询但没有获得任何更新的文档。

有关听众定价的更多详细信息,请观看此视频(尤其是3:16)

 类似资料:
  • 我写了一个逻辑,使用Spring反应器库来获取所有运算符,然后在异步模式下为每个运算符(分页)获取所有设备。 创建了一个通量来获取所有运算符,然后订阅它。 现在,对于每个运算符,我正在获取需要多个订阅才能获得设备mono的设备,该设备通过订阅MONO获得所有页面异步。 此代码工作正常。但我的问题是,从内部订阅mono是一个好主意吗?

  • 我正在尝试实现一个使用可观察的发出更改的类。当对此可观察对象完成订阅时,我想发送一个启动/初始化事件。然后我想发送通常的事件。 例如假设我有两个不同的订户A和B。A和B在不同的时间开始订阅。如果是MyClass。getChanges()发出事件1、2、3、4和5。 如果A在事件1、2之间启动it订阅,则应接收以下事件:InitialEvent、2、3、4、5。 如果B在事件4和5之间启动it订阅,

  •  说明 调用方法: $.f2eAct.yyue(el,options); 函数说明: Y阅功能,包含查询用户是否订阅,用户订阅,用户取消订阅 参数说明: 参数名 类型 说明 备注 el string DOM元素对象 必要 pcode int 订阅媒体的id 必要 gcode int 媒体用户分组id 必要 success function 查询是否订阅回调方法 无 confirm functio

  • 订阅指过滤表(table)的规则,Canal 客户端发送给客户端订阅规则,那么服务端将会推送符合规则的表数据过来,采用正则匹配。 允许所有表:.\*\\\\..\*

  • 物联网有很多设备,通过订阅设备的topic可以监听物联网设备接收到的消息。 请求方式: "|4|1|2|topic|\r" 参数: topic 设置订阅的topic,获取设备topic可参考教程 返回值: "|4|1|2|1|\r" 订阅成功 "|4|1|2|2|1|\r" topic订阅达到上限(一个OBLOQ最多订阅5个topic),订阅失败 "|4|1|2|2|2|\r" topic订阅失败

  • 我想问以下问题:例如,考虑一下我购买专业订阅。过了一段时间(几个月左右)我决定取消我的订阅...那么我已经用CodenameOne开发的应用程序会发生什么呢?它们会继续在谷歌Play商店和/或苹果应用商店上提供吗?我主要关心的是推送通知功能...也就是说,Play Store和/或App Store中已经发布的应用程序是否会保持完整的功能?