2017-07-17 84 views
2

我搜索了它,但所有的答案都很老,所以也许有更好的方法。 我试着从火力地堡DB至极随机获得一个项目看起来是这样的:从Firebase获取随机项目

enter image description here

我想获得一个随机的用户,多数民众赞成。

任何想法?

+0

看起来不像你可以不用持有用户列表本地 - https://开头计算器。com/a/35086931/782358 –

+0

您可以尝试以数组的形式检索所有用户标识。然后使用Math.random随机挑选其中一个用户。如果你想使用这种方法,我可以告诉你的实现 – UmarZaii

+0

@UmarZaii我真的会赞赏! – Ace

回答

5

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

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

但是,如果你不知道有多少孩子有(或有孩子列表存储在其他地方),没有直接的方法来解决这个问题,而没有首先接收树中的所有孩子。有关更多信息,请参见In Firebase, is there a way to get the number of children of a node without loading all the node data?

+2

知道有多少用户的最佳方法可能是使用Google Cloud Functions来创建脚本以增加表格的计数字段。 –

0

首先,您已从Firebase中检索所有用户标识。

然后声明一个存储所有userid的数组。下面显示了如何存储userId。

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

0

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

btw。整洁的功能limitToFirst + limitToLast不起作用,至少不是在JavaScript(网络)。

我能想出(如果密钥索引“时随机”是不够的),最好的是:

如果你只需要数据随机一次(我的情况,随机一副扑克牌):

在该数字上添加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() 
});