从 Firebase 获取随机项目

IT技术 javascript firebase firebase-realtime-database
2021-03-15 03:06:40

我搜索了它,但所有的答案都很旧,所以也许有更好的方法。我正在尝试从 Firebase 数据库中获取一个随机项目,如下所示:

在此处输入图片说明

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

有任何想法吗?

4个回答

编辑:似乎此解决方案不起作用,因为不允许一起使用“limitToFirst”和“limitToLast”。作为参考,这是建议的(不起作用)解决方案,假设您知道用户数量:

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

如果您不知道有多少个孩子(或者在其他地方存储了一个孩子列表),那么如果不首先接收树中的所有孩子,就没有直接的方法来解决这个问题。请参阅在 Firebase 中,有没有办法在不加载所有节点数据的情况下获取节点的子节点数?了解更多信息。

我也是,我也犯了同样的错误
2021-04-28 03:06:40
了解有多少用户的最佳方法可能是使用 Googles Cloud Functions 创建脚本来增加表的计数字段。
2021-04-29 03:06:40
对我来说这不起作用,我收到一条错误消息,说您不能一起使用limitToFirstlimitToLast下面的解决方案更好,因为您不必保留项目的数量(这在 Firebase 中实际上也很棘手)。
2021-05-08 03:06:40
和我现在一样。也在寻找一个快速简单的答案,但这很容易成为现实。
2021-05-10 03:06:40

我不得不解决同样的问题,我向所有记录添加了一个从 0 到 1 的随机数,最终通过startAtlimitToFirst过滤为 1。

示例: https ://your-project-qwert.firebaseio.com/example.json?orderBy="random"&limitToFirst=1&startAt=0.84

如果用户数量不大,类似 startAt=0.84... 的查询可能不会返回节点。为了确保始终选择一个,我总是选择带有 orderByxxx.limitToLast(1) 的节点,然后更新所选节点的随机字段,以便将其放入有序列表中的随机位置。
2021-04-24 03:06:40
附加说明:您首先必须请求列表中最大的随机数(使用orderByxxx.limitToLast(1))以确保使用正确绑定随机数var rand = Math.random() * highestValue;
2021-04-27 03:06:40
这有效。当前接受的答案不起作用(不再?),因为不允许同时使用 limitToFirst 和 limitToLast 。此外,保持数组的计数并不总是可扩展的。他应该是公认的答案。
2021-04-28 03:06:40
我同意(已接受答案的海报)。我当时尝试了解决方案,不知道为什么它不再起作用了。无论如何,这个解决方案更加优雅和有用。有谁知道我是否可以做些什么来帮助使这个成为公认的答案?:)
2021-05-02 03:06:40
只有提出问题的人才能更改已接受的答案(我认为)。
2021-05-19 03:06:40

我一直在寻找相同的功能,现在我想可以使用新发布的Cloud Firestore来完成,但我正在寻找一个简单的解决方案。

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

我能想到的最好的(如果关键索引“时间随机”还不够)是:

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

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

首先,您已经从 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

问题是这不可扩展。加载整个索引效率不高,只是随机选择一个。特别是当您查看的记录大于用户表时。
2021-05-18 03:06:40