我正在开发一个维护交易分类帐的简单应用程序。
我的数据如下:
{
"payments": {
"user1": {
"payment1": {
"amount": 2,
"timestamp": 1475303826
}
}
},
"purchases": {
"user1": {
"purchase1": {
"amount": 0.25
"timestamp": 1475303735
},
"purchase2": {
"amount": 1.99
"timestamp": 1475303792
}
}
},
"users": {
"user1": {
"balance": -0.24
}
}
}
每当我添加付款时,我希望用户的余额增加,当我添加购买时,我希望余额减少。
有没有办法设置Firebase规则,以便用户的余额始终等于其购买和付款的总和?
修改
根据Frank van Puffelen的回答,我设法制定了这些规则:
"purchases": {
"$uid": {
"$pid": {
".validate": "!data.exists() && (newData.parent().parent().parent().child('users/'+$uid+'/balance').val() == root.child('users/'+$uid+'/balance').val() - newData.child('amount').val())"
}
}
},
"payments": {
"$uid": {
"$pid": {
".validate": "!data.exists() && (newData.parent().parent().parent().child('users/'+$uid+'/balance').val() == root.child('users/'+$uid+'/balance').val() + newData.child('amount').val())"
}
}
}
这些确保任何新的购买或付款都伴随着对用户余额的匹配更新。
我现在正试图制定一些规则,以防止在不添加购买或付款的情况下更改余额。我有想法为用户的余额添加规则,以验证在更新期间,只有一个新购买或付款,但我认为没有办法使用规则DSL计算节点的子节点。 / p>
答案 0 :(得分:1)
无法表达值必须是安全规则中所有其他值的总和。这本质上是一种不可扩展的操作,因为它需要评估每次更新的所有数据。
最近我能想到的是一个系统,您可以在其中评估每次更新的当前余额,交易金额和新余额。所以(非常简化)类似的东西:
newData.child("balance").val() == data.child("balance").val() - data.child("amount").val()
这个解决方案与我前一段时间的做法非常接近,以确保voteCount
和选民名单保持同步。见Is the way the Firebase database quickstart handles counts secure?