如何从Firebase中检索随机子项

时间:2018-02-15 17:47:00

标签: android firebase random firebase-realtime-database querying

假设我们要从questions节点中检索15个随机子节点,这个节点的数据库结构如下:

enter image description here

1。从Firebase检索随机子节点的第一种(直观和讨论)方法是检索整个所需的父节点(questions作为dataSnapshot),然后选择一些随机子节点客户端。许多帖子都指出了这种方法,例如this one here 。 显然,这种方法有其缺点;例如,当查询大型父节点(例如超过10,000个孩子)时,每次检索这样的数量会导致巨大的带宽使用以及客户端负担。(当我们实际上只需要少量的孩子时)

2。继续:另一种方法,如here所述,它使用迭代器以某种方式绕过整个客户端负担,但巨大的带宽使用可以我们每次都下载整个父节点时仍会出现。

3。汤姆在this firebase discussion中的答案中描述了一种有趣的方法:

  

执行此操作的一种hacky方法是生成随机密钥并使用startAt()。limit(1)执行查询。我觉得这可能会损害你的firebase的性能,所以这不应该是你经常执行的操作。我们没有真正的随机样本函数。

这个解决方案实际上听起来不错,但我不确定它会如何影响我的Firebase。

4. 另一个愚蠢的解决方案实际上可以手动命名问题ID,可以说从0到N,因此在客户端处理随机的id组并检索问题点 - 知道节点的实际名称。

5。最后,我提出了以下解决方案,我问它是否比上面提到的更可行或更不可行:只创建包含问题ID的另一个父级,并且在需要时,应该检索此父级,即比questions父母“更轻”。从那里,我会有特定的随机ID,我只需要狙击那些孩子。为了更好地理解我的意思,请查看下面的图片: enter image description here

现在,从这种方法出现以下问题:分配(比方说)15 eventListeners良好做法?这真的会让事情变慢吗? (注意:这也适用于方法3和4)

最终,从大型数据库查询某些随机孩子时,哪种方法实际上是最佳方法?

2 个答案:

答案 0 :(得分:1)

您可以使用我在answer中解释的经典解决方案,但如果您害怕获取大量数据,请使用15个侦听器。使用侦听器没有任何问题,只要您根据活动的生命周期将其删除即可。所以,恕我直言有15名听众。

答案 1 :(得分:0)

我们这里有2个案例

案例1

如果你想一次获取随机id的所有细节,那么我建议1个父节点的监听器(使用pojo类获取datasnapshot的值)。

案例2

如果您想根据要求独立获取详细信息,那么您必须为每个(随机ID)附加一个监听器。

关于效果

尝试仅使用Listener For Single Value Events,因为他们一次听,然后停止(更好的表现)。

不要使用Value Event Listener(因为这些侦听器会继续检查更改,因此随着侦听器的增加而导致性能下降)。

修改

让我们说你听了(questions_ids)节点,现在你可以访问随机id键,将它们存储在String变量中,然后在同一个监听器内添加另一个监听器(问题)指向你想要的id抓住细节

import re

s= 'Sun 10:00am - 10:00pm<br>Mon 10:00am - 10:00pm<br>Tue 10:00am - 10:00pm<br>Wed 10:00am - 10:00pm<br>Thu 10:00am - 10:00pm<br>Fri 10:00am - 10:00pm<br>Sat 10:00am - 10:00pm'

pattern = r'\d{2}:\d{2}[AaPp][Mm]'

timestamps = re.findall(pattern, s)[:2]

print(timestamps)