0

我正在構建一個「事件」應用程序,其中一些用戶在應用程序中放置了一些事件,其他用戶可以看到它們。假設每個事件都有一個開始日期時間,結束日期時間和名稱。如何在Firebase數據庫中過期數據

我想讓用戶只看到當前事件,即以<開始<結束的事件。這是某種過濾功能,Firebase不支持這種過濾功能。我可以通過startAt和endAt查詢在我的應用程序中實現此目的。但是,這不會幫助我隱藏用戶的機密數據,因爲雖然我的應用程序不會訪問過去和將來的事件,但任何人都可以從其REST API查詢數據庫以查看這些事件。

因此,我決定用三個事件列表構造數據:past_events,current_eventsfuture_events

現在,問題是,我需要將事件從future_events移動到current_events和從current_eventspast_events時候是正確的。我相信無法在Firebase中自動觸發這些更改。因此,我正在考慮在某個地方定期進行清理。

這是處理Firebase中數據過期的最佳方式嗎?任何建議/意見?

感謝

+0

如果Firebase結構設置正確,則可能需要考慮更改設計,因爲「移動」數據以「清理」通常不是必需的。例如,在運行查詢時,只返回存儲在該節點中的時間戳大於7天前的那些結果。這樣,您就不必擔心代碼爲您處理「即將到期」的數據。或者返回時間戳爲七天後節點的結果。所有在代碼和Firebase規則中完成的操作都會限制用戶訪問其他任何數據。 – Jay

+1

@Jay,那麼'''代碼處理你的部分與@Pawel Janicki的答案是一樣的,問題是,它隱藏了來自應用程序用戶的數據,但是當你去查詢數據庫時直接(例如通過郵差),你可以看到所有事件。 依賴於應用程序端查詢不提供數據庫安全性。我希望這些數據是保密的,因此沒有人(包括腳本小子)應該看到。這隻能通過安全規則來實現,安全規則不能提供過濾。 –

回答

0

如果你對每一個事件,保存在火力地堡結束日期時間,然後你可以查詢火力地堡只爲結果是積極的。

實例在JavaScript:

var date = new Date(); 
var currentTime = date.getTime(); 
var ref = firebase.database().ref("events"); 
var result = ref.orderByChild("endtime").startAt(currentTime); 

用於查詢火力地堡文檔:https://firebase.google.com/docs/reference/js/firebase.database.Query#startAt

當談到清理數據庫,如你所說,是沒有辦法火力點內自動執行(如據我所知),所以如果你想避免手工清理數據庫,最好寫一個外部服務來做到這一點。

+0

查詢解決了應用程序的問題,但我的問題是在數據庫級別強制執行此操作。如果不隱藏數據庫級別的數據並依賴查詢,任何人都可以手動查詢Firebase API以查看您不希望他們看到的事件。 –

+0

當然,我面臨與我的應用程序相同的問題。我猜想,唯一的辦法是爲您的應用添加一些後端,這些後端將連接到相同的Firebase數據庫並執行所有邏輯。因此,它可以綁定到數據庫並相應地定期檢查時間戳並在列表之間移動事件。 –

+0

@AhmetErenBaşak「任何人」如何查詢您的數據?如果您設置了[Rules](https://firebase.google.com/docs/database/security/),則只有符合該條件的用戶才能訪問這些數據。 – Jay