Firestore 查询流和获取之间的区别?

Posted

技术标签:

【中文标题】Firestore 查询流和获取之间的区别?【英文标题】:Difference between Firestore Query stream & get? 【发布时间】:2018-10-14 22:32:01 【问题描述】:

我打算使用 NodeJS api 从 Firestore 数据库中查询大量数据。使用流 api (https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Query?#stream) 代替常规查询获取 (https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Query?#get) 有什么好处吗?

我的印象是流式传输在内存消耗方面更有效。

我的查询环境是 Firebase 函数。

【问题讨论】:

【参考方案1】:

是的,使用 stream 而不是 get 将减少 Cloud Function 的内存消耗!我亲身体验过:当我将 get 替换为 stream 时,我的函数内存从 1GB 变为 200MB。

提供更多详细信息:使用 Node.js Admin SDK,以访问您的数据:

首先定义一个查询。您可以指定一个集合并添加 where、offset、limit、startAfter 来更准确地描述您需要的数据。如果不添加任何说明符,则查询整个集合。 然后通过以下 3 个函数之一获取相应的结果: get,它返回一个快照,其中包含与您的查询匹配的所有文档(如果您没有限制查询,则返回整个集合)。如果您不想爆炸记忆,则绝对需要在查询中添加限制子句。 onSnapshot,它创建了一个监听器,它将为您提供与您的查询匹配的文档。我注意到它会发送一大批初始的所有文档,然后在创建文档时发送它们。所以它可以爆炸你的记忆,你不知道什么时候停止听,所以我不在 Cloud Functions 中使用它(但我真的很喜欢它在客户端,另一个故事) stream,它为您提供了一个 Node.js 可读流。您可以使用此流,它会一一提供文档,因此对您的记忆很有帮助。

【讨论】:

以上是关于Firestore 查询流和获取之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

java 8流和并行流之间的区别

Apollo:订阅与查询解析器之间的区别?

内存流和文件流的区别

Firestore 方法 docRef.set(someData, merge:true) 和 docRef.update(someData) 之间的区别? [复制]

Angular Firestore 查询中的 get() 和 valueChanges() 有啥区别? [关闭]

流和 firebase 状态不佳的问题:DocumentSnapshotPlatform 中不存在字段