从firebase快照中选择随机值

我正在使用firebase的foreach从这个url中将每个孩子都放在一棵树上

目标,当页面加载时从firebase中抓取一个随机项并显示它

数据结构

grabbit (table name) active (for active items for sale) category (the category of the item ie womensClothes, MensShoes etc) unique id of the item 

在页面加载进入http://gamerholic.firebase.com/grabbit/active并抓住任何一个类别并返回它..

脚本

 var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'); grabbitRef.on('value', function(snapshot) { if(snapshot.val() === null) { alert("invalid"); } else { // get snap shot data: snapshot.forEach(function(snapshot) { var name = snapshot.name(); alert(name); }); } }); 

在我有一个随机类别说“电子产品”后,我得到一个新的快照并让它返回电子产品中的任何随机项目

  var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'+name); grabbitRef.on('value', function(snapshot) { if(snapshot.val() === null) { alert("invalid"); } else { // get snap shot data: snapshot.forEach(function(snapshot) { var id = snapshot.name(); alert(id); }); } }); 

有了id,我现在可以获得该项目的详细信息

 var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'+name+'/'+id); 

不幸的是,无法从Firebase的列表中获取随机项。 您可以使用limit(1)来获取第一个项目,或者使用endAt()。limit(1)来获取最后一个项目。

如果您正在使用forEach,您还可以使用Math.random随机获取所有项目,然后随机选择一项。 例如:

 var i = 0; var rand = Math.floor(Math.random() * snapshot.numChildren()); snapshot.forEach(function(snapshot) { if (i == rand) { // picked random item, snapshot.val(). } i++; }); 

实现此目的的一种方法是使用列表中的每个元素存储一个额外的子属性,该元素将采用随机值。 我们将此属性的名称称为“randomVal”。

要选择随机条目,您将使用orderByChild(“randomVal”),然后将查询限制为仅返回一个条目。 在获取此条目后,您可以立即将新的随机值写入“randomVal”元素。

除了额外的簿记工作之外,这种方法的最大缺点是每次要选择随机元素时都需要写入数据库。 我是firebase的新手,所以我不知道这个缺点有多重要。

此外,请确保在“randomVal”上索引数据库的这一部分以提高查询性能。