【问题标题】:Firestore fetch document ids without fetching document dataFirestore 在不获取文档数据的情况下获取文档 ID
【发布时间】:2023-02-25 03:11:09
【问题描述】:

我在 Firestore 中存储了大量大型文档。由于获取整个集合的成本很高,我想为我的用户获取文档 ID 列表,并且只在我的用户做出选择后获取文档数据。

这就是我获取文档 ID 的方式

  const querySnapshot = await db
      .collection("myCollection")
      .get()

  const ids = querySnapshot.docs.map((document) => document.id);

不幸的是,我认为上面的代码同时获取了文档 ID 和文档数据。有没有办法只获取文档ID而不获取文档数据?

如果由于 Firestore 的限制无法实现上述操作,那么维护第二个集合以跟踪第一个集合中的文档 ID 的最佳做法是什么? Firebase 是否支持使用可以自动为我维护第二个集合的云函数的任何类型的“插入/删除”挂钩?

【问题讨论】:

    标签: google-cloud-firestore


    【解决方案1】:

    有没有办法只获取文档id而不获取文档数据?

    不适用于 Firebase 网络和移动 SDK。只要在查询中匹配,它们总是会获取整个文档。

    后端 SDK 允许您使用 select() 指定您想要的字段。确切的表达因语言而异。有关详细信息,请参阅 API 文档。

    如果您使用的是 node.js,请参阅:

    维护第二个集合以跟踪第一个集合中的文档 ID 的最佳做法是什么?

    这是一个见仁见智的问题——没有正确答案。如果您发现它有助于满足您的计费和性能要求,您应该简单地这样做(基本上,您应该计算一下是否对您有所帮助)。在不知道您的查询模式的情况下,我们无法评估此策略是否对您有任何好处。

    Firebase 是否支持使用可以自动为我维护第二个集合的云函数的任何类型的“插入/删除”挂钩?

    查看 Firestore 的 Cloud Functions 触发器。您还没有说您是否在使用 Firebase 扩展,因此您应该研究哪种风格适合您。

    https://firebase.google.com/docs/functions/firestore-events

    https://cloud.google.com/functions/docs/calling/cloud-firestore

    【讨论】:

      【解决方案2】:

      这是一个基于使用 Firestore REST API 的技巧。

      使用 listDocuments 方法列出集合的文档时,您可以使用掩码查询参数定义要返回的字段。

      诀窍如下:如果您在掩码中指定一个不存在的字段,您会收到每个文档的以下数据:name(这是 Firestore 文档的路径)、createTimeupdateTime

      例如,下面是调用以下 URL (GET) 的响应:

      https://firestore.googleapis.com/v1/projects/my-firebase-project-id/databases/(default)/documents/my-collection?mask.fieldPaths=dummy
      

      回复:

      {
        "documents": [
          {
            "name": "projects/my-firebase-project-id/databases/(default)/documents/my-collection/0J60r8Vp5fkTtCRRITky",
            "createTime": "2021-11-07T16:20:15.487153Z",
            "updateTime": "2021-11-07T16:20:15.487153Z"
          },
          {
            "name": "projects/my-firebase-project-id/databases/(default)/documents/my-collection/JQJFwy7i0BmIV8Wb5Yds",
            "createTime": "2021-11-07T16:21:26.473099Z",
            "updateTime": "2021-11-07T16:21:26.473099Z"
          }
        ]
      }
      

      如您所见,很容易确定文档的 ID,因为它们是路径的最后一个元素。


      再次,我并不是说这是一个完美的解决方案但它的工作原理是,与通过其中一个客户端 SDK 完成的查询相比,它返回​​的数据更少。您只需发出一个 HTTP 调用而不是使用其中一个客户端 SDK,您可以很好地并行使用这两个(即 HTTP 调用和使用 SDK)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-03
        • 2020-10-23
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        • 2019-07-04
        相关资源
        最近更新 更多