亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

firebase RTDB 事務刪除

firebase RTDB 事務刪除

慕萊塢森 2023-06-15 10:22:39
我一直在很好地使用 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)這總是會導致節點被刪除嗎?交易是否始終取決于調用順序,或者它是關于誰先完成的競爭條件。
查看完整描述

1 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

事務只能在 a 上運行DatabaseReference,而不能在 上運行Query。因此,在您的情況下,您將必須在完整someRef節點上運行事務,然后修改currentVal以刪除屬性與您的條件匹配的節點uid。


如果有很多uid值,這可能會導致讀取比需要的數據多得多的數據,如果多個用戶可能同時執行此操作,這可能會導致爭用和重試。在這種情況下,請考慮另一種數據結構,它允許您運行更獨立的事務,例如通過將每個uid值的節點存儲在該值下作為鍵。


someRef: {

  "uid1": {

    ...

  },

  "uid2": {

    ...

  }

}

使用這樣的結構,uid可以通過簡單的單個寫入操作來刪除單個值的所有值。


查看完整回答
反對 回復 2023-06-15
  • 1 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號