Database 使用AngularFire从Firebase中拾取随机记录

Database 使用AngularFire从Firebase中拾取随机记录,database,angularjs,firebase,angularfire,Database,Angularjs,Firebase,Angularfire,有没有办法从firebase获得这样的随机记录: { "-JbmopNnshefBT2nS2S7" : { "dislike" : 0, "like" : 0, "post" : "First post." }, "-JbmoudijnJjDBSXNQ8_" : { "dislike" : 0, "like" : 0, "post" : "Second post." } } 我用这段代码解决了这个问题,但它下载了所有记录,因此如果

有没有办法从firebase获得这样的随机记录:

{
  "-JbmopNnshefBT2nS2S7" : {
    "dislike" : 0,
    "like" : 0,
    "post" : "First post."
  },
  "-JbmoudijnJjDBSXNQ8_" : {
    "dislike" : 0,
    "like" : 0,
    "post" : "Second post."
  }
}
我用这段代码解决了这个问题,但它下载了所有记录,因此如果DB更大,我的应用程序将运行得非常慢:

HTML代码:

    <div ng-controller="RandomCtrl">{{RandomPost.post}}</div>

您可以使用包含所有键的对象来解决大型数据库的问题,关于拾取随机键,我认为您的方式很好

我猜另一种方法是使用@lombausch所说的增量键,然后您可以使用key()方法的组合来获得添加的最后一个键,然后根据最小值、最大值获得随机值

以下是保存增量/数字键的反模式:

key()方法引用:

您可以将startAt与您自己的增量索引一起使用。例如,假设您的记录中有索引(0到n)

执行此查询:orderByChild(“index”).startAt(rint).limitToFirst(1)

请参阅代码snipbit:

var rint = Math.floor((Math.random() * 10)) // you have 10 records
var query = ref.orderByChild("index").startAt(rint).limitToFirst(1);

var results = $firebaseArray(query);
results.$loaded(
  function(x) {
    // let's get one
    $scope.oneResult = x[0];
  }, function(error) {
    console.error("Error:", error);
  });
};

您可以使用增量作为键,然后随机选择一个。谢谢您和@lombausch的回答!但我不明白如何使用增量键存储数据,因为Firebase会生成唯一键。例如,我想添加这样的数据:{“name”:“Alex”,city:“LA”}和{“name”:“Sam”,“city:“Berlin”}。发送后,我想得到如下DB:{1:{“name”:“Alex”,city:“LA”},2:{“name:“Sam”,“city:“Berlin”}。有什么办法吗?您是否使用set()检查了我的第一个链接?您可以指定所需的密钥(增量值),但与文档中提到的一样,您可能会遇到并发/同时写入的一些问题。
var rint = Math.floor((Math.random() * 10)) // you have 10 records
var query = ref.orderByChild("index").startAt(rint).limitToFirst(1);

var results = $firebaseArray(query);
results.$loaded(
  function(x) {
    // let's get one
    $scope.oneResult = x[0];
  }, function(error) {
    console.error("Error:", error);
  });
};