我正在使用Firebase
进行小型iOS项目,我想知道以下是否可行。
在给定节点" myNode_123"我存储数据记录;每条记录的形状如下:
[fieldStr: "ABC_xyz", fieldNum: 678]
记录实际上是一个子节点。
现在我的问题是关于更新现有记录的数据。
只有当fieldNum的新值高于已存在的值时,才允许某人更新数据记录。 无论如何,fieldStr的值应该保持不变。
我已经编写了一些规则来确保fieldNum满足我的请求。 但我仍然认为fieldStr有被改变的风险。
以下是我的规则:
{
"rules": {
".read": true,
//".write": true
"myNode_123": {
"$Record": {
// Ensure that we are either creating a new record not yet existing,
// or that we are only updating for a higher fieldNum.
".write": "(!root.child('myNode_123/'+$Record).exists()) ||
(root.child('myNode_123/'+$Record).exists() && (newData.child('fieldNum').val() > data.child('fieldNum').val()))"
}
}
}
}
fieldNum的控制正如我所愿。但是仍然可以改变fieldStr,这是我不想要的。
Firebase专家的任何建议?
答案 0 :(得分:0)
在$ Record。
下添加{
"rules": {
".read": true,
//".write": true
"myNode_123": {
"$Record": {
// Ensure that we are either creating a new record not yet existing,
// or that we are only updating for a higher fieldNum.
".write": "!data.exists() || newData.child('fieldNum').val() > data.child('fieldNum').val()",
"fieldStr": {
".validate": "!data.exists() || data.val() == newData.val()"
}
}
}
}
}
!data.exists()
将确保只能将新数据写入此位置。并且data.val() == newData.val()
将添加一个异常,以便在新数据与旧数据相同时允许写入,以防您想要将整个对象写入数据库并包含fieldStr。