2016-04-20 1 views
0

Ich habe einige denormalisierter Einheiten in Firebase, etwa wie folgt:Wie kann ich mein Firebase-Array gemäß Daten in einem anderen Knoten bestellen?

projects 
    -KFsomething 
    name: "foo" 
    -KFwhatever 
    name: "bar" 
users 
    UID-1234 
    name: "Bob" 
    UID-5678 
    name: "Alice" 
observations 
    -KFblah 
    project: -KFwhatever 
    user: UID-1234 
    timestamp: 1234567890 
    -KFrandom 
    project: -KFsomething 
    user: UID-5678 
    timestamp: 1234567899 

und so weiter, mit anderen Kindern. Es gibt andere Entitäten mit ähnlichen Beziehungen. Ich muss in der Lage sein, Listen von Benutzern oder Projekten oder anderen Dingen auf einer Webseite anzuzeigen, sortiert nach ihre jüngste zugehörige Beobachtung. Also würden die Benutzer Alice dann Bob sortiert, denn Alice hat die neuere Beobachtung. Ebenso würden Projekte foo dann bar sortiert, da die neuere Beobachtung zu foo gehört.

Wie kann ich dies mit denormalisierten Daten tun? Die parameterbestimmende Sortierreihenfolge gehört nicht zu den zu sortierenden Objekten. Kann ich etwas mit den Daten machen, um es einfacher zu machen, oder brauche ich einige mehrstufige clientseitige Abfragen?

Antwort

2

In NoSQL müssen Sie Ihre Daten häufig so modellieren, dass Sie sie verwenden können. Da Sie Benutzer nach ihrer neuesten Beobachtung anzeigen möchten, sollten Sie den Zeitstempel der neuesten Beobachtung für jeden Benutzer speichern.

projects 
    -KFsomething 
    name: "foo" 
    mostRecentObservationTimestamp: 1234567899 
    -KFwhatever 
    name: "bar" 
    mostRecentObservationTimestamp: 1234567890 
users 
    UID-1234 
    name: "Bob" 
    mostRecentObservationTimestamp: 1234567890 
    UID-5678 
    name: "Alice" 
    mostRecentObservationTimestamp: 1234567899 
observations 
    -KFblah 
    project: -KFwhatever 
    user: UID-1234 
    timestamp: 1234567890 
    -KFrandom 
    project: -KFsomething 
    user: UID-5678 
    timestamp: 1234567899 

Sie werden schreiben Regel, dass zusätzliche Informationen, während Sie die neue Beobachtung hochladen, wird mit einem Multi-Location-Update:

var observation = { 
    project: "-KFsomething", 
    user: "UID-5678" 
    timestamp: 1234567899 
}; 
var updates = {}; 
var key = ref.push().key(); 
updates['observations/'+key] = observation; 
updates['users/'+observation.user+'/mostRecentObservationTimestamp'] = observation.timestamp; 
updates['projects/'+observation.project+'/mostRecentObservationTimestamp'] = observation.timestamp; 
ref.update(updates); 

diese große blog post on client-side fan-out See.

+0

Ich kam gerade zu dieser Schlussfolgerung. Gut zu wissen, dass ich auf dem richtigen Weg war. –