Google cloud firestore Javascript Firestore客户端是否缓存文档引用?

Google cloud firestore Javascript Firestore客户端是否缓存文档引用?,google-cloud-firestore,Google Cloud Firestore,为了防止我试图解决这里的XY问题,这里有一些上下文(域是一个角色扮演游戏伴侣应用程序)。我有一个文档(活动),其中有一个集合(字符),我正在使用angular.io/angularfire 这里的核心问题是,如果我查询活动中的字符集合,我会返回可观察的。我可以在*ngFor character of characters | async中使用它,但这会导致下游有点混乱-我真的想做一些事情,比如将attributes块作为独立组件()等等 这最终意味着在实际的显示组件中,我混合了通过ngOnCha

为了防止我试图解决这里的XY问题,这里有一些上下文(域是一个角色扮演游戏伴侣应用程序)。我有一个文档(活动),其中有一个集合(字符),我正在使用angular.io/angularfire

这里的核心问题是,如果我查询活动中的字符集合,我会返回可观察的
。我可以在
*ngFor character of characters | async
中使用它,但这会导致下游有点混乱-我真的想做一些事情,比如将attributes块作为独立组件(
)等等

这最终意味着在实际的显示组件中,我混合了通过ngOnChanges(来自角色的东西)改变的项目和可观察的项目(由全局服务注入的东西,比如扮演特定角色的用户)

我有几个选项可以让它更干净(第0个是:忽略它)

第一:我可以将所有可能的依赖关系扁平化为标量,而不是可观察的(可能是通过将属性作为仅真实的视图组件来处理,并将更多数据作为直接输入来注入-
等。可显示的更改可以自行处理

第二:我可以找到一些神奇的方法将
可观察的
转换成
可观察的
,这正是我想要的,然后将可观察的角色向下传递到各种角色显示块(有一些不同的显示选项,取决于你是否是玩家)(所以你想要更多关于你的角色的细节,以及关于其他一切的小信息)或者GM(所以你想要关于所有可以扩展到任何地方的细节的中间细节)

第三:我可以传递
Character.id
并让子组件在
ngOnInit
中为它构造一个可观察的对象,而不是将整个
字符
传递到我的组件中。(或者可能是
switchMap
在ngOnChanges中,不清楚angular运行时是否会通过更改参数来重用不同项目的实际组件,但这是一个不同的堆栈溢出问题).在本例中,我将对同一文档进行多次读取-在查询中读取一次以获取所有字符,在每个视图组件中读取一次,该视图组件被赋予characterId并需要获取相关字符的可观察值

所以问题是:如果我在代码中的三个不同位置执行
firestore.collection('/foo/1/bar').valueChanges()
,然后执行
firestore.doc('/foo/1/bar/1').valueChanges()
,这会调用四次firestore读取(用于计费),一次读取,还是两次读取(一次用于查询,一次用于文档)

我深入研究了firebase javascript sdk,eventmanager可能只通过维护一个侦听器数组来处理同一项目的多个查询,但坦率地说,我对这里的代码考古还没有信心


这里可能也有一个选项四。我可能设计过度了,但这个特殊的玩具项目主要是为了让我能够在firestore中与最佳实践搏斗,所以我想找出正确的方法。

我查看了SDK链接的代码,它可能是库足够聪明,可以优化同一文档的多个观察者,使其只阅读该文档一次。但是,这是一个很危险的实现细节,因为它可能会在不通知的情况下更改,因为它不是公共API的一部分

一方面,如果您已经考虑到上述危险,并且仍然愿意进行调查,那么您可以创建一些测试程序来发现目前的情况,方法是检查控制台UI中的读取使用情况,或者临时修改SDK源代码并添加一些日志,以帮助您了解引擎盖下发生的事情

另一方面,我相信部分问题来自应用程序状态管理的角度。事实上,无论是侦听集合还是侦听每个单独的文档,都会通知应用程序的相同更改,这里的不同之处在于数据将如何在组件之间流动以及这些更改将如何管理我会选择任何感觉更好的方法


希望这能有所帮助。

请编辑问题,以便更清楚地了解如何查询这些文档。只需调用
firestore.collection(“/foo/1/bar”)
根本不需要花费任何费用,因为它只是创建一个对集合的本地引用,实际上并不读取任何内容。直到您附加一个侦听器或调用get()时,才会读取任何内容或对其进行计费。当然-我正在调用
.valueChanges()