javascript - 从 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())
});
如果有办法解决这个问题,请告诉我。
解决方案
我会这样解决这个问题:
为每个列表元素创建一个带有字段名称id
或您想要的其他名称的值。它应该是一个简单的整数。理想情况下随着列表逐渐增长。每次添加元素时,您都可以使用计数器增加值。
当试图从列表中获取一个随机元素时,首先获取一个介于 0 和所有元素总数之间的随机整数。然后使用此查询获取单个随机元素:
firebase.database().ref("users").orderByChild("id").startAt(randomNumber).limitToFirst(1);
即使您不id
使用the,randomNumber
您也将使用neareas下一个元素。这应该能够扩展到任何大小。
最困难的部分是选择id
增量而不重复它们。我会为此使用一个云功能,它会在添加项目时执行此操作。即使与柜台组合也会很有趣。
推荐阅读
- flutter - 在多次调用的选项卡之间切换 initstate()
- php - 为什么我不能使用 img 标签回显?
- php - 将高级自定义字段添加到 Dokan 上的现有表单 - 添加产品和编辑产品页面 (WordPress/WooCommerce)
- laravel - Vuejs如何在子组件中使用Vue-slick?
- windows - 未定义的引用。在 cmake 中:lib 到 lib
- c# - Moq 设置给出错误 System.NullReferenceException
- c# - 如何在 wpf 中更改用户控件形式的另一个用户控件上的按钮?
- ruby - Ruby 块/匿名函数占位符参数
- sql-server - 您如何使用代理运算符而不是电子邮件地址使用 TSQL 发送电子邮件?
- javascript - 在节点 js 的 lof 文件中记录打印时显示当前日期和时间