首页 > 解决方案 > Firestore 查询流和获取之间的区别?

问题描述

我打算使用 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 函数。

标签: firebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


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

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

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

推荐阅读