2015-11-07 54 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

相关问题