我一直在很好地使用 firestore 事务,并一直在尝试实现一些 RTDB 版本。
我有一棵带有自动生成键的树。这些键的值是映射,其中一个键是“uid”,例如
"AUTOGENKEY" : {
"uid" : 'a uid'
},
...etc
我想要一个可以删除所有单身用户节点的事务...如果用户在事务期间创建了任何新节点,它应该重试并将新节点包含在事务删除中。
我目前有这个
await rtdb.ref(‘someRef’)
.orderByChild(‘uid’)
.equalTo(uid)
.once('value')
.transaction(function(currentVal) {
// Loop each of the nodes with a matching ‘uid’ and delete them
// If any of the nodes are updated (or additional nodes are created with matching uids)
// while the transaction is running it should restart and retry the delete
// If no nodes are matched nothing should happen
});
但是我想仔细检查我是否需要在 currentVal 回调中进行另一个事务,以及我是否可以只返回 null 来删除每个节点。
我一直在使用这个答案作为参考Firebase 数据库事务搜索和更新
亲切的问候
- 编辑新方法
坦率地说,我听取了您的建议,最终只是像这样存储我的数据:
uid -> counter
我不知道交易不能在查询中运行,谢谢你让我知道。
我需要能够从 uid 计数中添加/减去数量,如果它导致数字低于 0,则应删除该节点。如果我将 null 作为数量传递,它应该删除该节点。这就是我目前拥有的。
async function incrementOrDecrementByAmount(pathToUid, shouldAdd, amount, rtdb){
await rtdb.ref(pathToUid)
.transaction(function(currentVal) {
if(currentVal == null || amount == null) {
return amount;
}else{
let newAmount = null;
// Just sum the new amount
if(shouldAdd == true) {
newAmount = currentVal + amount;
} else {
const diff = currentVal - amount;
// If its not above 0 then leave it null so it is deleted
if(newAmount > 0) {
newAmount = diff;
}
}
return newAmount;
}
});
}
如果我有以下执行,我不确定第一个 if 语句。
incrementOrDecrementByAmount (somePath, 10, true, rtdb)
incrementOrDecrementByAmount (somePath, 100, false, rtdb)
这总是会导致节点被删除吗?交易是否始终取决于调用顺序,或者它是关于谁先完成的竞争条件。
ITMISS
相关分类