2017-04-16 58 views
0

我試圖使用具有Firebase函數的批量操作來刪除日期大於'2017-04-05'的所有節點。你能發現我在這裏做錯了嗎?批量刪除node.js中的firebase數據庫中的項目

應該被刪除的2個節點是紅色的: enter image description here

下面是錯誤的代碼 - 你可以看到有什麼不對?另外,我擔心這個問題的表現(我只會在一段時間內運行一次)。如果列表中有數以百萬計的遊戲,如果我每天只運行一次,是否應該關注我?

exports.remove = functions.https.onRequest((req, res) => { 

    const deleteBeforeDate = req.query.deleteBeforeDate; 

    var ref = admin.database().ref('games'); 

    var keysToDelete = {}; 
    for (var game in this.games) { 

     var date = items[i]['.date']; 
     if(date.value > '2017-04-05'){ 
      keysToDelete[game.key] = null; 
     } 
    } 
    this.ref.update(keysToDelete); 
}); 

非常感謝你,

邁克

+1

'this.games'不被任何填充。 –

+1

此外,沒有孩子'。日期'(期間似乎是一個錯字)。 –

回答

3

來確定鍵刪除,你需要附加一個監聽器。因爲這是需要的,你還不如創建選擇正確的兒童和刪除只有那些查詢:

var ref = admin.database().ref('games'); 
var deleteAfterDate = ref.orderByChild('date').startAt('2017-04-05'); 

deleteAfterDate.once('value').then(function(snapshot) { 
    var updates = {}; 
    snapshot.forEach(function(child) { 
    updates[child.key] = null; 
    }); 
    ref.update(updates); 
}); 
+0

謝謝弗蘭克!很高興有這方面的專家幫助!我嘗試了第一次運行,並且在Firebase函數日誌中出現了超時錯誤'已完成狀態超時'。我注意到ref.orderByChild('date')似乎跳過它們之間的節點(我想要刪除的實際節點)。如果我爲了一個真的是孫子的東西而訂購孩子,那麼它還能工作嗎?我再次運行代碼,現在不會從最後10分鐘的通話中返回 - 而且我只有16個遊戲在數據庫中... – Mike

+0

您的JSON在您所在的節點上顯示直接子節點的日期試圖刪除。在合理數量的節點上(使用你已經顯示的結構,在任何地方高達幾十萬),這應該不需要10分鐘。但這取決於很多因素。你可以在更容易調試的東西中重現問題,比如jsbin? –

+0

正確,json顯示我想要刪除的節點是date的直接父節點,但我們已經在ref變量中選擇了date的祖父節點,並且在date上調用orderByChild的時候是兩級。雖然我對此很陌生,所以我可能不理解。我會研究jsbin(從來沒有聽說過),並嘗試使調試更容易! :) – Mike