我面临的问题是,我的 firebase 数据库中有一个密钥列表,我想从中检索一个随机密钥,而无需下载所有密钥并在我自己的应用程序中选择一个。使用例如 .once()
下载所有密钥是一个很大的问题,特别是因为我将来可能会得到 10.000 多个密钥,而且我不希望我的 Firebase 账单爆炸,我仍然是一个完全没有预算的学生。
我已经研究过这个主题并发现 following answer for my question.
问题在于,我不能在同一个查询中使用 limitToFirst()
和 limitToLast()
,否则我会收到以下错误:
[未处理的承诺拒绝:错误:Query.limitToLast:Limit was 已经设置(通过另一个调用 limit、limitToFirst 或 limitToLast)。]
其他人也像我一样面临同样的问题,我通常看到这个问题总是得到很多观点,但答案很差,就像我之前提到的过时的情况一样,或者只是不适合在 Javascript 和 React 中使用-原生。
附加信息:我有一个用于存放密钥的计数器,因此我每次都知道我的数据库中存储了多少个密钥。下图完全显示了我的数据库:
这是我的代码中显示提到的错误的部分:
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())
});
如果有办法解决这个问题,请告诉我。
答案 0 :(得分:1)
我会这样解决这个问题:
为每个列表元素创建一个字段名称为 id
或您想要的其他值的值。它应该是一个简单的整数。理想情况下,随着列表的递增而增长。每次添加元素时,您都可以使用计数器增加值。
当尝试从列表中获取随机元素时,首先获取一个介于 0 和所有元素总数之间的随机整数。然后使用此查询获取单个随机元素:
firebase.database().ref("users").orderByChild("id").startAt(randomNumber).limitToFirst(1);
即使你没有用 id
击中 randomNumber
,你也会接近下一个元素。这应该可以扩展到任何大小。
最困难的部分是选择 id
增量而不重复它们。我会为此使用一个云函数,它会在添加项目时执行此操作。甚至与计数器的组合也会很有趣。