如何检查Firebase规则中具有未知键的现有数据的值?

如何检查Firebase规则中具有未知键的现有数据的值?,firebase,firebase-security,Firebase,Firebase Security,使用Firebase安全规则,如何检查同级值以确定newData是否有效 在我的应用程序中,每个游戏都有移动列表。这里的游戏是1405584062293: 当提交一个新的移动时,我想参照已经播放的移动来验证它。对于初学者来说,一个玩家应该只能玩每秒的移动(玩家一可以玩从索引0开始的偶数移动,玩家二可以玩奇数移动) 由于每一步的关键是一个未知的随机字符串(根据),我不知道如何检查前一步。我也不知道如何计算现有移动的数量 这是我的结构: { "rules":{ ".read":true

使用Firebase安全规则,如何检查同级值以确定
newData
是否有效

在我的应用程序中,每个
游戏
都有
移动列表
。这里的游戏是
1405584062293

当提交一个新的移动时,我想参照已经播放的移动来验证它。对于初学者来说,一个玩家应该只能玩每秒的移动(玩家一可以玩从索引
0
开始的偶数移动,玩家二可以玩奇数移动)

由于每一步的关键是一个未知的随机字符串(根据),我不知道如何检查前一步。我也不知道如何计算现有移动的数量

这是我的结构:

{
  "rules":{
    ".read":true,
    "games":{
      "$game":{
        "moves":{
          "$move":{
            ".write":"auth !== null",
            // Something along these lines would get me going...
            ".validate":"data.parent().keys.count % 2 == 0"
          }
        }
      }
    }
  }
}

实际上,游戏规则要复杂得多,我希望我需要使用Firesafe或类似的解决方案,但现在我想知道如何实现这些和其他类似的简单规则。

只要你不撤消移动(例如,从Firebase中的列表中删除移动),将其存储为数组(imo)没有什么错


如果从数组中删除元素,会出现问题,因为索引中的数字将被跳过,Firebase将不再将其视为数组,而是将其视为具有数字作为键的对象。

并非每个用例都能适合管理通用列表的单一推荐方法。当然不是你的。您可能会发现这种方法更有用

由于不能对子记录键/值执行包含操作,因此将维护一个可以递增的值。例如,利用上面的增量ID方法,我可以编写一个安全规则,以确保我正在写入奇数密钥(并且仅在轮到我时),如下所示:

".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()"

有,并且包括由多个用户同时编辑的任何数据。这并不像从不删除那么简单。谢谢你的帮助!实际上,我最终解决了我的问题,只需选择移动id(
move-0
move-1
move-2
)。由于可以合理地假设玩家将拥有游戏的完整移动列表,因此不需要计数器。一切都好了。