5

我正在使用 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);
4

2 回答 2

8

不幸的是,无法从 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++;
});
于 2013-09-24T19:38:00.710 回答
0

实现这一点的一种方法是在列表的每个元素中存储一个附加的子属性,该属性将采用随机值。让我们将此属性的名称称为“randomVal”。

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

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

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

于 2017-08-31T13:47:23.623 回答