Поскольку вы сохраняете значение в виде строки, Firebase будет использовать в нем операторы лексикографического упорядочения и сравнения строк. Я очень рекомендую хранить числовые значения как фактические числа, что значительно упрощает правила:
JSON:
{
"orders" : {
"-Lfi6kSDLOmcvGgfiWjX" : {
"amount" : 100,
"price" : 0.01,
},
},
"users" : {
"GNzSciHRZAgZgIrhqIvR2vzVugj2" : {
"balance" : 100,
}
}
}
Код JavaScript:
firebase.database().ref('orders').push().set ({
price: 10,
amount: 1
});
Правила:
"orders": {
".read": true,
".write": "
root.child('users').child(auth.uid).child('balance').val() > 0 &&
root.child('users').child(auth.uid).child('balance').val() >= newData.child('price').val()"
}
Обратите внимание на изменение с >
на >=
и в последнем выражении, поскольку вы, вероятно, также хотите разрешить запись, когда у пользователя точно достаточно денег.
Обновление
Кроме того, ваши правила объявляются самим orders
, где они должны быть объявлены на один уровень ниже в определенном порядке.
Итак:
"orders": {
"$orderId": {
".read": true,
".write": "
root.child('users').child(auth.uid).child('balance').val() > 0 &&
root.child('users').child(auth.uid).child('balance').val() >= newData.child('price').val()"
}
}