【问题标题】:Pick random record from Firebase with AngularFire使用 AngularFire 从 Firebase 中选择随机记录
【发布时间】:2015-01-26 12:10:12
【问题描述】:

有没有办法像这样从 firebase 获取随机记录:

{
  "-JbmopNnshefBT2nS2S7" : {
    "dislike" : 0,
    "like" : 0,
    "post" : "First post."
  },
  "-JbmoudijnJjDBSXNQ8_" : {
    "dislike" : 0,
    "like" : 0,
    "post" : "Second post."
  }
}

我用这段代码解决了这个问题,但是它下载了所有的记录,所以如果数据库更大,我的应用程序会运行得很慢:

HTML 代码:

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

JS代码:

var app=angular.module('App', ['firebase']);

app.controller('RandomCtrl', function($scope, $firebase){
    var ref = new Firebase("https://ind.firebaseio.com/");
    var sync=$firebase(ref);

    $scope.messages = sync.$asArray();

    $scope.GetRandomPost=function(){
        return $scope.RandomPost=$scope.messages[Math.floor(Math.random()*$scope.messages.length)];
    };

    $scope.GetRandomPost();    

});

【问题讨论】:

  • 您可以使用增量作为键,然后简单地随机选择一个。

标签: database angularjs firebase angularfire


【解决方案1】:

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

执行以下查询:orderByChild("index").startAt(rint).limitToFirst(1);

查看代码片段:

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

【讨论】:

    【解决方案2】:

    您可以使用包含所有密钥的对象来解决大型数据库的问题,关于选择随机密钥,我认为您的做法很好。

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

    这是保存增量/数字键的反模式: https://www.firebase.com/docs/web/guide/saving-data.html#section-push

    key() 方法参考: https://www.firebase.com/docs/web/api/firebase/key.html

    【讨论】:

    • 感谢您和@lombausch 的回答!但我不明白,如何使用增量键存储数据,因为 Firebase 会生成唯一键。例如,我想添加这样的数据:{"name":"Alex",city:"LA"} 和 {"name":"Sam","city":"Berlin"}。发送后我想得到这样的数据库:{1:{"name":"Alex",city:"LA"},2:{"name":"Sam","city":"Berlin"}}。有什么办法吗?
    • 您是否使用 set() 检查了我的第一个链接,您可以指定所需的密钥(增量值),但就像文档中提到的那样,您可能会或不会遇到并发/同时写作的一些问题。
    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多