2015-11-07 52 views
0

我想讓Firebase擁有最近添加的最近10個對象,但沒有更多。我將以Web服務器日誌爲例。如何將10個最新對象存儲在Firebase中?

假設我有一個程序正在觀看Web服務器日誌。每次在日誌中創建新條目時,我都希望我的Firebase從該條目中獲取IP地址。但我只需要Firebase存儲最近發送的10個IP地址,而不是每個IP地址都收到。

我可以在火力地堡設立10個對象想象這樣做,說:

app/slot0 
app/slot1 
app/slot2 
app/slot3 
etc 

然後PATCH槽0添加的IP,並完成後,更新插槽追蹤:

currentSlot++

而當currentSlot達到10時,它將環繞並指向0

if(currentSlot > numSlots) currentSlot = 0;

因此,它基本上是一個包含10個對象的列表,我正在手動跟蹤哪個插槽是下一個插槽。這種方式我不需要存儲無限數量的項目,而只需要存儲最後的10個項目。聽取所有這些插槽的客戶端在每次更​​改時都會得到更新。

我的問題是這是否是這樣做的最佳方式?我不禁想到有一種更有效的方法。

+0

顯示你的工作。甚至無法分辨我們在這裏工作的語言。 – Kato

回答

2

有100種不同的方法可以做到這一點,但這裏有一個想法:

假設一個應用程序商店的10個IP在一個陣列(0-9)和IP索引0是最新的IP連接。

建立新連接時,索引9處的IP將從數組中刪除,並且0-8處的IP將其索引遞增(索引0處的IP移至索引1,索引1處的IP移至索引2等等)。

然後將最新的IP插入項目0.將陣列數據寫入Firebase。

根據您的平臺,這很容易,因爲將IP插入索引0處的數組中並刪除索引10,然後寫入firebase。

但是,儘量避免將數組寫入Firebase。有很多更好的方法來做到這一點 - 具有IP和時間戳的節點可以很好地工作。

connection_events 
    connection_id_
     ip: 192.168.1.1 
     timestamp: 20151107133000 
    connection_id_4566 
     ip: 198.168.1.123 
     timestamp: 20151107093000 

的CONNECTION_ID的由childByAutoId產生或推使他們「隨機」,但你總是有時間戳的命令。

使用上述結構的另一個想法是Firebase查詢最老的一個,然後刪除該節點,然後添加最新的一個。這將工作,因爲排序由時間戳控制。

+0

查詢最古老的是這裏的最佳選擇;數字ID是有問題的,因爲你已經提到了。但是這兩種解決方案都假定不會有併發編輯;當這些事情發揮時,情況會變得相當複雜。 – Kato

+0

@Kato我的回答中指出的connection_id_0123和connection_id_4566實際上是childByAutoId或推送生成的隨機節點ID。我應該在我的回答中說明這一點。此外,我認爲這是一個在Firebase內執行這些更改的程序。如果有這些數據發生併發會話,那麼應該考慮到這一點,因爲這肯定會變得更棘手。 – Jay

相關問題