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