【发布时间】:2017-11-25 11:42:20
【问题描述】:
【问题讨论】:
标签: firebase firebase-realtime-database
【问题讨论】:
标签: firebase firebase-realtime-database
使用安全规则可以做你想做的事。
由于您对最大子节点数的限制为 1,因此您可以利用不存在没有子节点的密钥这一事实。
如果你使用这样的规则:
{
"rules": {
"ongoing": {
"$key": {
".read": "auth != null",
".write": "auth != null && ((newData.exists() && (!data.parent().exists() || data.exists())) || !newData.exists())"
}
}
}
}
将允许写入:
ongoing 键不存在;或如果已经存在一个子元素,该规则将阻止添加另一个子元素(因为 ongoing 键已经存在)。
【讨论】:
您不能将其表达为验证规则。您可以改为使用云函数来表达基于现有数据接受或拒绝更改的逻辑。您的客户端代码可能需要通过写入数据库的不同部分或 HTTPS 函数来调用此函数。
【讨论】:
这可能不是您想要的,但它确实提供了解决方案:
改变你的结构
ongoing
child_0
id: "some id"
到
ongoing
child_count: 1
child_0
id: "some id"
然后是规则
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"ongoing": {
".validate": "root.child('ongoing').child('child_count').val() < 1"
}
}
}
当你最初创建正在进行的节点时,像这样创建它
ongoing
child_count: 0
然后在添加节点时,将 child_count 更改为 1。从那里添加或修改正在进行的节点的任何尝试都将被拒绝。
【讨论】: