首页 > 解决方案 > 从 Firebase 数据库中检索随机密钥

问题描述

我面临的问题是我的 firebase 数据库中有一个密钥列表,我想从中检索一个随机密钥,而无需下载所有密钥并在我自己的应用程序中选择一个。例如,下载所有密钥.once()是一个很大的问题,特别是因为我将来可能会得到 10.000 多个密钥,而且我不希望我的火力基础账单爆炸,我仍然是一个根本没有预算的学生。

我已经研究了这个主题,并为我的问题找到了以下答案。

问题是,我不能在同一个查询中使用,否则我会收到以下错误limitToFirst()limitToLast()

[未处理的承诺拒绝:错误:Query.limitToLast:限制已设置(通过另一个对限制、limitToFirst 或limitToLast 的调用)。]

其他人也像我一样面临同样的问题,我通常看到这个问题总是得到很多意见,但答案很差,就像我之前提到的情况一样,显然已经过时,或者只是不适合在 Javascript 和 React-Native 中使用。

附加信息:我有一个密钥计数器,所以我每次都知道我的数据库中存储了多少密钥。下图完全显示了我的数据库: 在此处输入图像描述

这是我的代码的一部分,它显示了提到的错误:

const numberOfUsers = await firebase.database().ref("usercounter").once("value").then(snapshot => {
            return(snapshot.val()); //retrieve numbers of users from "usercounter"
        });
        const randomIndex = Math.floor(Math.random() * numberOfUsers) + 1; //"generating random number, excluding 0"
        var ref = firebase.database().ref('users'); //ref to my users keys
        await ref.limitToFirst(randomIndex).limitToLast(1).once('value').then(DataSnapshot =>
            {
                //This is the query that does not work at all. 
                console.log(DataSnapshot.val())
               
            });

如果有办法解决这个问题,请告诉我。

标签: javascriptfirebasereact-nativefirebase-realtime-database

解决方案


我会这样解决这个问题:

为每个列表元素创建一个带有字段名称id或您想要的其他名称的值。它应该是一个简单的整数。理想情况下随着列表逐渐增长。每次添加元素时,您都可以使用计数器增加值。

当试图从列表中获取一个随机元素时,首先获取一个介于 0 和所有元素总数之间的随机整数。然后使用此查询获取单个随机元素:

firebase.database().ref("users").orderByChild("id").startAt(randomNumber).limitToFirst(1);

即使您不id使用the,randomNumber您也将使用neareas下一个元素。这应该能够扩展到任何大小。

最困难的部分是选择id增量而不重复它们。我会为此使用一个云功能,它会在添加项目时执行此操作。即使与柜台组合也会很有趣。


推荐阅读