从火力快照中随机选取值

Pick random value from firebase snapshot

本文关键字:随机 选取 快照      更新时间:2023-09-26

我正在使用Firebase的foreach从这个网址获取树中的每个孩子

目标,当页面加载时,从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"上索引数据库的这一部分,以提高查询性能。