我一直在很好地使用 firestore 事務(wù),并一直在嘗試實現(xiàn)一些 RTDB 版本。我有一棵帶有自動生成鍵的樹。這些鍵的值是映射,其中一個鍵是“uid”,例如"AUTOGENKEY" : { "uid" : 'a uid'}, ...etc我想要一個可以刪除所有單身用戶節(jié)點的事務(wù)...如果用戶在事務(wù)期間創(chuàng)建了任何新節(jié)點,它應(yīng)該重試并將新節(jié)點包含在事務(wù)刪除中。我目前有這個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 回調(diào)中進行另一個事務(wù),以及我是否可以只返回 null 來刪除每個節(jié)點。我一直在使用這個答案作為參考Firebase 數(shù)據(jù)庫事務(wù)搜索和更新親切的問候- 編輯新方法坦率地說,我聽取了您的建議,最終只是像這樣存儲我的數(shù)據(jù):uid -> counter 我不知道交易不能在查詢中運行,謝謝你讓我知道。我需要能夠從 uid 計數(shù)中添加/減去數(shù)量,如果它導致數(shù)字低于 0,則應(yīng)刪除該節(jié)點。如果我將 null 作為數(shù)量傳遞,它應(yīng)該刪除該節(jié)點。這就是我目前擁有的。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; } });}如果我有以下執(zhí)行,我不確定第一個 if 語句。incrementOrDecrementByAmount (somePath, 10, true, rtdb)incrementOrDecrementByAmount (somePath, 100, false, rtdb)這總是會導致節(jié)點被刪除嗎?交易是否始終取決于調(diào)用順序,或者它是關(guān)于誰先完成的競爭條件。
firebase RTDB 事務(wù)刪除
慕萊塢森
2023-06-15 10:22:39