从Firebase数据库中检索随机密钥
从Firebase数据库中检索随机密钥
我面临的问题是,我在我的Firebase数据库中有一个键列表,我想要随机检索一个键,而不是在自己的应用程序中下载所有键并选择一个。使用.once()
下载所有键是不可行的,尤其是因为将来可能会有10,000多个键,我不希望Firebase账单暴涨,我还是一个没有任何预算的学生。
我已经研究了这个主题,并找到了以下问题的答案。
这个问题是,我不能在同一个查询中同时使用limitToFirst()
和limitToLast()
,否则会出现以下错误:
[Unhandled promise rejection: Error: Query.limitToLast: Limit was
already set (by another call to limit, limitToFirst, or limitToLast).]
其他人也面临着和我一样的问题,我一般看到这个问题总是有很多的浏览量,但回答却比较差,就像在之前提到的情况中,回答已经过时,或者只是不适用于JavaScript和React-Native。
额外的信息:我有一个计数器来统计我的键的数量,所以我知道每个时刻数据库中存储了多少个键。以下图片展示了我的整个数据库:
这是我的代码的一部分,显示了上述错误:
const numberOfUsers = await firebase.database().ref("usercounter").once("value").then(snapshot => { return(snapshot.val()); //从"usercounter"中获取用户数量 }); const randomIndex = Math.floor(Math.random() * numberOfUsers) + 1; //"生成随机数,排除0" var ref = firebase.database().ref('users'); //指向我的用户键 await ref.limitToFirst(randomIndex).limitToLast(1).once('value').then(DataSnapshot => { //这是完全不起作用的查询。 console.log(DataSnapshot.val()) });
如果有一种方法可以解决这个问题,请告诉我。
问题的原因是需要从Firebase数据库中检索随机的键值。解决方法是为列表中的每个元素创建一个带有字段名为"id"的值,最好是一个简单的整数,可以使用计数器来增加值,每次添加一个元素时增加计数器的值。当尝试从列表中获取随机元素时,首先获取一个介于0和所有元素总数之间的随机整数,然后使用以下查询获取一个随机元素:firebase.database().ref("users").orderByChild("id").startAt(randomNumber).limitToFirst(1); 即使没有与randomNumber匹配的"id",也会得到最接近的下一个元素。这种方法可以适用于任何规模的数据。获取增量的"id"而不重复使用它可能是最困难的部分,我会使用一个云函数,在添加项目时执行这个操作,甚至与计数器相结合也是一个有趣的选择。我尝试了一下,效果非常好。不仅解决了下载过多数据的问题,还获得了我要求的键,以及嵌套在其下的子值,对于我的目的来说完全可以接受。这个解决方案也适用于我在问题中分享的链接示例。我认为这里不需要使用云函数,因为当我创建一个新用户(这就是这些ID的用途)时,我会自动增加所有用户的总数计数器。当计数器增加时,我可以再次获取它,并为新的列表元素分配一个id,即totalusers+1。任务完成。唯一有点奇怪的是弹出的一个警告:FIREBASE WARNING: Using an unspecified index. Your data will be downloaded and filtered on the client. 你认为这对我的应用程序构成威胁吗?我搜索了这个警告,现在在我的安全规则中添加了".indexOn": "counter",这个警告消失了,现在一切都完美了。对于回复晚了,很抱歉。是的,只需为'id'字段添加一个索引即可解决这个警告问题。很高兴听到它解决了