如何在规则表达式中引用数据库的 NEW 根?

How to reference the NEW root of the database in the rule expression?

为了说明我的用例,请考虑用户和组之间的双向关系。用户可以属于一个组,组包含一个用户列表。

{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      "groupId": "techpioneers",
    },
    "eclarke": {
      "name": "Edmund M. Clarke"
    },
    // ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true
      }
    },
    // ...
  }
}

要将 eclarke 关联到一个组,客户端应该在一次更新中更新两个路径(/users/eclarke/groupId/groups/techpioneers/members/eclarke),这样就没有中间无效状态。

为了确保这一点,我为每个路径设置了安全规则以相互引用:

{
  "rules": {
    "users": {
      "$userId": {
        "groupId": {
          ".validate": "newData.parent().parent().parent().child('groups').child(newData.val()).child('members').hasChild($userId)"
        }
      }
    },
    "groups": {
      "$groupId": {
        "members": {
          "$memberId": {
            ".validate": "newData.parent().parent().parent().child('users').child($memberId).child('groupId').val() === $groupId"
          }
        }
      }
    }
  }
}

我不能在这里使用 root 因为我会查看旧的数据库状态。

有更好的方法吗? (无需多次 .parent() 调用)

不幸的是,没有 newRoot 变量可以解决多个 parent 调用。这个概念 添加到 Bolt 安全规则语言中,但由于它从未添加到常规 JSON 语言中,因此 Bolt 也将其编译为所需数量 parent来电。

所以目前,您所拥有的是执行此操作的正确方法。 file a feature request 是个不错的主意,因为团队看到此请求可能已经有一段时间了。