也许我从SQL的角度来解决这个问题太多了,但是我很难理解如何正确地限制哪些孩子应该被允许填充节点.
假设我想保留具有任意名称的产品记录.每个产品必须包含一个price,但不允许任何其他产品.
我天真的方法是向.validate需要newData来包含price子price节点的产品添加规则,显式授予对节点的写访问权限,然后删除对节点的所有访问$other(有点像switch语句中的default子句):
{
"rules": {
"$product": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['price'])",
"price": {
".write": true,
".validate": "newData.isNumber()"
},
"$other": {
".read.": false,
".write": false,
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.{"price": 1234, "foo": "bar"}仍然会接受添加新产品.但是,如果我添加 (不管怎样,我做错了.)".validate": false规则$other,{"price": 1234}则不接受任何内容(例如,不允许).
有没有办法实现类似于我在这里尝试的东西?如果没有,在Firebase中限制数据结构的正确方法是什么?我应该这样做吗?如果我不这样做,是什么阻止用户用垃圾填充我的数据库?