2014-11-27 7 views
7

C'è un modo per ottenere record a caso da Firebase come questo:Scegli record a caso dalla Firebase con AngularFire

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

Ho usato questo codice per risolvere il problema, ma è scaricare tutti i record, quindi se DB sarebbe più grande, la mia applicazione funziona molto lento: codice

HTML: codice

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

}); 
+0

è possibile utilizzare incremento come una chiave e poi semplicemente casualmente sceglierne uno. – webduvet

risposta

0

È possibile lavorare con un oggetto che contiene tutte le chiavi per risolvere il problema con DB di grandi dimensioni, per quanto riguarda il prelievo di una chiave casuale, penso che tu sia bravo nel modo in cui lo stai facendo.

Un altro modo per fare suppongo stia utilizzando chiavi incrementali come ha detto @lombausch, quindi è possibile utilizzare una combinazione di metodo key() per ottenere l'ultima chiave aggiunta e quindi ottenere un valore casuale basato sui valori minimo e massimo.

Ecco l'anti-modello per salvare incrementali chiavi/numerici: https://www.firebase.com/docs/web/guide/saving-data.html#section-push

chiave() Metodo di riferimento: https://www.firebase.com/docs/web/api/firebase/key.html

+0

Grazie a voi e @lombausch per le risposte! Ma non riesco a capire, come posso memorizzare i dati utilizzando le chiavi incrementali, perché Firebase rende invece le chiavi univoche. Ad esempio, voglio aggiungere dati come questo: {"nome": "Alex", città: "LA"} e {"nome": "Sam", "città": "Berlino"}. Dopo l'invio voglio ottenere DB in questo modo: {1: {"nome": "Alex", città: "LA"}, 2: {"nome": "Sam", "città": "Berlino"}}. C'è modo di farlo? – user3258741

+0

Hai controllato il mio primo collegamento utilizzando set() puoi specificare la chiave che desideri (un valore incrementale) ma, come accennato nei documenti, potresti riscontrare o meno problemi con la concorrenza/scritture simultanee. –

2

È possibile utilizzare startAt con il proprio indice incrementale. Ad esempio, supponi di avere un indice (da 0 a n) nei tuoi record.

Questa query: orderByChild ("index"). StartAt (rint) .limitToFirst (1);

vedere il codice snippit:

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