从 Firebase 获取随机项目
编辑:似乎此解决方案不起作用,因为不允许一起使用“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 中,有没有办法在不加载所有节点数据的情况下获取节点的子节点数?了解更多信息。
我不得不解决同样的问题,我向所有记录添加了一个从 0 到 1 的随机数,最终通过startAt和limitToFirst过滤为 1。
示例: https ://your-project-qwert.firebaseio.com/example.json?orderBy="random"&limitToFirst=1&startAt=0.84
我一直在寻找相同的功能,现在我想可以使用新发布的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