Firebase 实时数据库:如果要写入的值尚未存储在数据库中,如何将规则设置为仅写入数据库

Firebase Realtime DB: How to setup rule to only write to DB if value being passed to be written is not already stored in DB

我正在寻找在我的 Firebase 实时数据库中设置规则的语法,以确认从我的应用程序传递的值在写入另一个重复条目之前不存在于该特定位置。我正在为推送通知传递一个“ExponentPushToken”值。这是匿名发生的。也就是说,写入是在没有任何用户身份验证的情况下发生的,数据库只是存储一个“ExponentPushToken”列表,如下所示:

{
  "users" : {
    "push_token" : {
      "auto-generated key" : "ExponentPushToken-value"
    }
  }
}

我尝试使用以下内容,但它仍然允许写入“重复”值。我想知道这是否与为每个实例生成一个写入数据库的值的随机 'auto-generated key' 有什么关系,或者我是否没有正确考虑这个问题。

{
  "rules": {
    ".read": "false",
    ".write": "true && newData.val() !== data.child('push_token').val()",
  }
}

对于上下文,每个 ExponentPushToken 都是用于打开我的应用程序的给定设备的唯一值。 ExponentPushToken 是无限期分配给该设备的唯一 ID,并且在特定设备访问应用程序的任何情况下都不会更改。 ExponentPushToken 无限期地分配给设备,并写入 DB。每次打开该应用程序时,都会有一个 push/set 命令将该令牌写入我的应用程序代码中的数据库。我想为 Firebase Realtime DB 设置一个规则,以确认从应用程序传递到数据库的值在该值已经存在的情况下不会被写入。我被卡住了,发现自己必须手动解析数据库以删除重复值以保持数据库清洁,并且不会向应用程序用户发送多个推送通知。

如果您能提供任何帮助或指导,我们将不胜感激!

谢谢!

规则在您声明它们的 node/path 的上下文中进行评估。因此,您问题中的 .write 规则是在根上进行评估的,并且 datanewData 都在根处包含 data/new 数据。

验证路径中没有数据的最简单方法是在该路径中定义此规则:

{
  "rules": {
    ".read": "false",
    "push_token": {
      "$pushId": {
        ".write": "!data.exists()",
      }
    }
  }
}

这里的$pusId是说下面的规则适用于push_token的每一个子节点,好像和你的JSON相匹配。有关详细信息,请参阅 wildcard variables.

上的文档

这不能使用 firebase 安全规则来完成,因为它们无法搜索值(无法扩展)。检查数据库中特定位置现有值的查询必须在执行 push/writing 值到数据库的应用程序中完成。

该应用程序需要查询数据库中的值并设置条件以防止写入重复值。

可以找到可以在应用程序中实施的工作代码示例 ,它可以实现此特定 ask/desired 结果的预期结果。