【问题标题】:how to maintain read counts of documents in firebase如何维护firebase中文档的读取计数
【发布时间】:2021-05-18 04:44:59
【问题描述】:

Firebase Firestore: How to monitor read document count by collection?

所以第一个类似的问题已经在大约一年前被问过了,所以不要将其标记为重复,因为我需要一些详细的建议。

所以这是场景,

假设我有一些数据库集合,将来我可能需要在数据库上执行一些机器学习。根据文件访问。

这是访问特定文档的次数和时间。

我知道上面提到的解决方案间接建议对数据库执行读取然后写入操作,以在每次访问数据库时附加读取计数。 但这似乎需要从客户端完成

现在,如果您看到,假设我有一些文档,客户端只能读取文档,而不能写入或更新。在这种情况下,要么我必须专门维护一个单独的集合来维护计数,这当然是来自客户端,否则我将不得不在父文档中公开一个特定字段(我将数据显示到的实际文档)客户端)被允许写入,其余字段受保护。

但是,从客户端获取这些数据对很多事情和参数来说都是一个警报,因为即使客户端没有经过身份验证,我也想收集这些数据。

我看到了云函数的文档,似乎没有触发函数作为看门狗来监听是否正在获取文档。

所以我想要一些关于我们如何通过在服务器中创建自己的自定义触发器或挂钩来在 GCP 中执行此操作的建议。

抢先一步会很有用。

【问题讨论】:

    标签: firebase google-cloud-platform google-cloud-firestore


    【解决方案1】:

    如果您使用客户端 SDK,则无法跟踪读取计数。您必须在中间有一些安全环境(Cloud Functions 或您自己的服务器)从 Firestore 获取数据。

    这样的callable function 可能有用:

    // Returns data for the path passed in data obj
    exports.getData = functions.https.onCall(async (data, context) => {
      const snapshot = admin.firestore().doc(data.path).get()
      //Increment the read count
      await admin.firestore().collection("uesrs").doc(context.auth.uid).update({
        reads: admin.firestore.FieldValue.increment(1)
      })
      return snapshot.data()
    });
    

    请注意,在这种情况下,您使用的是 Firebase Admin SDK,它可以完全访问所有 Firebase 资源(绕过所有安全规则)。因此,您需要自己授权用户。您可以像这样获取调用该函数的用户的 UID:context.auth.uid,然后一些简单的 if-else 逻辑可能会有所帮助。

    【讨论】:

    • 而不是从云函数中获取数据,如果我只是从 onload 函数中进行触发调用并仅从我的客户端应用程序传递一个文档 ID,这基本上会在服务器端启动一个看门狗,并且当客户端离开文档时,即 onDestroy,看门狗将停止并更新该特定文档的计数和观看时间。
    • 但它再次引起了人们的关注,因为我正在从未经身份验证的用户那里收集这些数据。我怎样才能阻止机器人是 trollers 以避免不必要地调用我的函数。
    • @50_Seconds_Of_Coding 问题是您不能依赖客户端来保持计数更新。如果没有云功能或您的服务器,就很难跟踪它。也许您可以从 Google Cloud Compute 设置一个小型 VM,然后运行一个快速应用程序,您无需为调用付费。
    【解决方案2】:

    一种解决方案是使用 Cloud Function 来读取或写入 Firestore,而不是直接从前端与 Firestore 交互(使用其中一个客户端 SDK)。

    通过这种方式,您可以保留一个或多个读取次数计数器,并计算和应用特定的访问权限,并且一切都在后端完成,而不是在前端完成。使用Callable Cloud Function,您可以开箱即用地获取经过身份验证的用户的用户 ID。

    请注意,通过云函数,您将失去客户端 SDK 的一些优势,例如使用侦听器进行实时更新的能力或通过标准安全规则声明访问权限的可能性。以下article 介绍了这种方法的优缺点。

    【讨论】:

    • 而不是从云函数中获取数据,如果我只是从 onload 函数中进行触发调用并仅从我的客户端应用程序传递一个文档 ID,这基本上会在服务器端启动一个看门狗,并且当客户端离开文档时,即 onDestroy,看门狗将停止并更新该特定文档的计数和观看时间。
    • 但它再次引起了人们的关注,因为我正在从未经身份验证的用户那里收集这些数据。我怎样才能阻止机器人是 trollers 以避免不必要地调用我的函数。
    猜你喜欢
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2021-11-18
    • 2023-03-28
    相关资源
    最近更新 更多