答案 0 :(得分:2)
可以使用安全规则执行您想要的操作。
由于您对最大子女数量的限制为1,因此您可以利用没有子女的钥匙不存在的事实。
如果你使用这样的规则:
{
"rules": {
"ongoing": {
"$key": {
".read": "auth != null",
".write": "auth != null && ((newData.exists() && (!data.parent().exists() || data.exists())) || !newData.exists())"
}
}
}
}
允许写入:
ongoing
键不存在;或该规则将阻止添加另一个子项(如果已存在)(因为ongoing
键已存在)。
答案 1 :(得分:1)
这可能不是您想要的,但确实提供了解决方案:
从
更改您的结构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
最初创建正在进行的节点时,请按照
创建它{{1}}
然后在添加节点时,将child_count更改为1.从此处将再次尝试添加或修改正在进行的节点。
答案 2 :(得分:0)
您无法将此表达为验证规则。您可以做的是使用云功能来表达接受或拒绝基于现有数据的更改的逻辑。您的客户端代码需要通过写入数据库的不同部分或HTTPS函数来调用此函数。