Javascript 从Firebase获取随机物品

Javascript 从Firebase获取随机物品,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我搜索过了,但是所有的答案都很旧,所以也许有更好的方法。我试图从Firebase DB中获取一个随机项,如下所示: 我想得到一个随机用户,仅此而已 有什么想法吗?首先,您要从firebase中检索所有用户ID 然后声明一个数组,该数组存储其中的所有用户ID。下面显示了如何存储用户ID var arr = new Array(); // or var arr = []; arr.push('user001'); arr.push('user002'); 接下来,您必须从一个userId中随机选

我搜索过了,但是所有的答案都很旧,所以也许有更好的方法。我试图从Firebase DB中获取一个随机项,如下所示:

我想得到一个随机用户,仅此而已


有什么想法吗?

首先,您要从firebase中检索所有用户ID

然后声明一个数组,该数组存储其中的所有用户ID。下面显示了如何存储用户ID

var arr = new Array();
// or var arr = [];
arr.push('user001');
arr.push('user002');
接下来,您必须从一个userId中随机选择

var item = arr[Math.floor(Math.random()*arr.length)];
// item is randomly picked userId
我很抱歉,因为我没有完全向您展示实现是如何工作的,因为我不太使用javascript


基本上,这就是逻辑的工作原理。我希望它能帮助您:D

如果您知道有多少用户,您可以这样做:

const numberOfUsers = 15;
const randomIndex = Math.floor(Math.random() * numberOfUsers);

var ref = firebase.database().ref('companies/01/users');

ref.limitToFirst(randomIndex).limitToLast(1).once('value').then(snapshot =>
{
    var user = snapshot.val();
    // do something with the user data
});

但是,如果您不知道有多少子级(或者在其他地方存储了一个子级列表),那么如果不首先接收树中的所有子级,就无法直接解决此问题。有关更多信息,请参阅。

我一直在寻找相同的功能,现在我想它可以通过新发布的Cloud Firestore实现,但我正在寻找一个简单的解决方案

顺便说一句,limitToFirst+limitToLast的整洁功能不起作用,至少在javascript(web)中不起作用

我能想到的最好方法(如果关键索引“time random”不够)是:

如果您只需要随机一次数据(我的情况,一副随机卡):

使用Math.random()和orderByChild()在该数字上添加一个值,删除键或使用startAt()和最后使用的键作为参数

var ref = firebase.database().ref('companies/01/users').push();
var randomValue = Math.random();
ref.update({ ..., 'r': randomValue });

...

var ref = firebase.database().ref('companies/01/users')
ref.orderByChild('r').limitToFirst(1).once('value').then(function(snapshot) {
  var data = snapshot.val()
  ...
  snapshot.remove()
});
如果应该使用数据,则需要多次获得一个已知索引的随机元素

可以添加已知编号的索引

var ref = firebase.database().ref('companies/01/users').push();
ref.update({ ..., 'r': '0001' });

...

var ref = firebase.database().ref('companies/01/users')
ref.orderByChild('r').limitToLast(1).once('value').then(function(snapshot) {
  var totalIndex = Object.values(snapshot.val())[0].r;
});
var randomValue = Math.floor(Math.random() * totalIndex);
ref.orderByChild('r').equalTo(randomValue).once('value').then(function(snapshot) {
  var data = snapshot.val()
});

我必须解决同样的问题,我在所有记录中添加了一个从0到1的随机数,最后通过startAtlimitToFirst过滤到1

例如:
“random”&limitToFirst=1&startAt=0.84

看起来不需要在本地保存用户列表就可以做到这一点——您可以尝试以数组的形式检索所有用户ID。并使用Math.random随机选择一个用户。如果你想用这种方法,我可以给你看implementation@UmarZaii我真的很感激!请进一步说明您的问题:Firebase数据库的结构到底是什么?到底什么需要随机化?您的代码示例只是一个简短的HTML片段,我想知道它与您的问题到底有什么关系。@ElmarJansen我编辑了这个问题以显示数据库结构。了解有多少用户的最佳方法可能是使用谷歌云函数创建一个脚本来增加表的计数字段。对我来说,这不起作用,我收到一个错误,说明不能同时使用
limitToFirst
limitToLast
。下面的解决方案更好,因为你不必记录物品的数量(这在Firebase中也很棘手)。也在寻找一个快速简单的答案,但这很容易成为事实。这很有效。当前接受的答案不起作用(不再?),因为不允许同时使用limitToFirst和limitToLast。此外,保留阵列计数并不总是可伸缩的。他应该是被接受的答案。附加说明:您首先必须请求列表中最高的随机数是什么(使用
orderByxxx.limitToLast(1)
),以确保使用
var rand=Math.random()*highestValue正确绑定随机数我同意(接受答案的海报)。我当时试过这个解决方案,不知道为什么它不再有效了。无论如何,这个解决方案更加优雅和有用。有人知道我是否能做点什么来帮助大家接受这个答案吗只有提出问题的人才能更改已接受的答案(我认为)。如果用户数量不大,则类似于startAt=0.84的查询。。。不能返回节点。为了确保总是选择一个,我总是选择orderByxxx.limitToLast(1)的节点,然后更新selected nodes随机场,以便在有序列表中放置一个rondom位置。问题是这是不可伸缩的。加载整个索引是没有效率的,只是随机选取一个索引。尤其是当您查看的记录大于用户表时。