从 firebase 数据库中检索随机密钥

时间:2021-06-02 21:16:35

标签: javascript firebase react-native firebase-realtime-database

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

我已经研究过这个主题并发现 following answer for my question.

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

<块引用>

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

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

附加信息:我有一个用于存放密钥的计数器,因此我每次都知道我的数据库中存储了多少个密钥。下图完全显示了我的数据库: enter image description here

这是我的代码中显示提到的错误的部分:

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())
               
            });

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

1 个答案:

答案 0 :(得分:1)

我会这样解决这个问题:

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

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

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

即使你没有用 id 击中 randomNumber,你也会接近下一个元素。这应该可以扩展到任何大小。

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