如果我正确理解你在寻找什么,你的$language 写入规则将如下所示:
{"rules":{
"codes":{
"$codeId":{
"snippets":{
"$language":{
".write": "(!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)"
}
}
}
}
}
}
更新:
在添加了您仍然需要在 /codes/$codeId 上的写入规则之后,我强烈建议您将 sn-ps 分支从代码分支中移出,因为这会增加单个节点的复杂性。您将开始处理这种复杂的规则逻辑,并且您的应用程序代码也将被这种结构所淹没。
尝试使用更不耦合的东西,例如下面的结构:
{
"rules":{
"codes":{
"$codeId":{
".write": "true",
"snippets":{
"$snippetID":{
}
}
}
},
"snippets":{
"$snippetID":{
"$language":{
".write": "(!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)"
}
}
}
}
}
说明
根据要求,我正在为这个特定的写入逻辑添加一些细节。
根据我得到的要求,如果用户正在写入新数据或者他“拥有”他正在尝试写入的数据,则他可以写入。
!data.exists() || data.child('uid').val() == auth.uid
由于“拥有”数据意味着该数据具有所有者 uid,因此我假设如果他正在编写数据,则用户 uid 需要始终存在。这就是我添加newData.child('uid').val() == auth.uid 的原因。 (请记住,newData 表示用户正在尝试写入的数据)。
(!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)
我可以将其规范化为波纹管以避免newData 检查逻辑的两侧,但至少对我来说,它更容易理解。
(!data.exists() || data.child('uid').val() == auth.uid) && newData.child('uid').val() == auth.uid