如何通过修改Firebase实时数据库规则实现条码匹配条件写入?
Firebase实时数据库规则实现条码存在性验证
问题描述
向Smart_Cart_Products节点添加新数据时,需要检查新数据的barcode值是否存在于Barcodes节点中,仅当条码存在时允许写入,否则拒绝。尝试了以下规则但未生效:
{ "rules": { "Smart_Cart_Products": { ".read": true, ".write": "newData.child(\"barcode\").val() == data.child(\"barcode\").val()" } } }
相关数据结构如下:
{ "Smart_Cart_Products": [ { "Desc1": "234", "Desc2": "248", "Desc3": "0.00", "barcode": "1674026293" }, { "Desc1": "235", "Desc2": "249", "Desc3": "0.01", "barcode": "1674026293" }, { "Desc1": "236", "Desc2": "250", "Desc3": "0.02", "barcode": "1674026293" }, { "Desc1": "237", "Desc2": "251", "Desc3": "0.03", "barcode": "1674026293" }, { "Desc1": "238", "Desc2": "252", "Desc3": "0.04", "barcode": "1674026293" } ], "Barcodes": [ { "barcode": "1674026297" }, { "barcode": "1674026296" }, { "barcode": "1674026294" }, { "barcode": "1674026293" } ] }
解决方案
可以通过修改数据库规则实现需求,但需要先调整Barcodes的数据结构,再编写正确的规则:
1. 调整Barcodes数据结构
当前Barcodes是数组结构,实时数据库规则无法高效遍历数组检查元素是否存在。需要将其改为键值对结构,用条码值作为节点的key,值可设为true(或其他任意值),示例如下:
{ "Barcodes": { "1674026297": true, "1674026296": true, "1674026294": true, "1674026293": true } }
2. 编写正确的数据库规则
修改规则,验证新数据的barcode字段存在,且对应的Barcodes节点存在:
{ "rules": { "Smart_Cart_Products": { ".read": true, ".write": "newData.hasChild('barcode') && root.child('Barcodes').child(newData.child('barcode').val()).exists()" } } }
规则逻辑说明
newData.hasChild('barcode'):确保写入的新数据包含barcode字段,避免无条码的数据被写入root.child('Barcodes').child(newData.child('barcode').val()).exists():检查新数据的条码值在Barcodes节点中存在,仅存在时允许写入
原规则无效原因
原规则newData.child("barcode").val() == data.child("barcode").val()仅用于更新数据时验证条码不被修改,完全未涉及Barcodes节点的存在性检查,因此无法实现需求。
内容的提问来源于stack exchange,提问作者Chani Nimasha
相关产品推荐
相关产品推荐

