2017-09-29 3 views
1

Ich baue eine Spiel-App mit Firebase und Swift und speichere meine Daten so.Filterung und Sortierung nach einem bestimmten Kind in Firebase

players: { 
    "category": { 
     "playerId": { 
     name: "Joe", 
     score: 3 
     } 
    } 
} 

Es gibt zwei Abfragen ich auf der Partitur vornehmen müssen zugrunde:

  • Holen Sie sich die Top-5 Spieler von einer einzelnen Kategorie.
  • Holen Sie sich die insgesamt 100 besten Spieler des Spiels.

Ich habe kein Problem, die Daten für die erste Abfrage bekommen,

ref.child("players").child(category).queryOrdered(byChild: "score").queryLimited(toLast:5) 

verwenden, aber ich habe Probleme mit der zweiten Abfrage herauszufinden. Wie kann ich das effizient machen?

+0

Nicht sicher, wer das abgelehnt hat, weil es wie eine gültige Frage scheint. Ich widerstimmte. –

+0

Ist es akzeptabel für Sie, dass Sie die Struktur Ihrer Datenbank ändern? Ich denke, wenn Sie die Struktur ändern, wäre es einfach – 3stud1ant3

+0

Ja, die Struktur kann geändert werden. –

Antwort

0

Sie müssen entweder eine zusätzliche Datenstruktur hinzufügen, um die zweite Abfrage zuzulassen (was in NoSQL-Datenbanken recht häufig ist), oder Ihre aktuelle Struktur ändern, um beide Abfragen zuzulassen.

Letzteres könnte erreicht werden, indem die Daten in eine einzige flache Liste mit einigen zusätzlichen synthetischen Eigenschaften umgewandelt werden. Z.B.

players: { 
    "playerId": { 
    category: "category1" 
    name: "Joe", 
    score: 3, 
    category_score: "category1_3" 
    } 
} 

Mit den neuen zusätzlichen Eigenschaften category und category_score, können Sie die Top-Scorer für eine Kategorie mit bekommen:

ref.child("players") 
    .queryOrdered(byChild: "category_score") 
    .queryStarting(atValue:"category1_") 
    .queryEnding(atValue("category1_~") 
    .queryLimited(toLast:5) 

Und das Top-100-Scores insgesamt mit:

ref.child("players") 
    .queryOrdered(byChild: "score") 
    .queryLimited(toLast:100) 

Für mehr dazu finden Sie hier meine Antwort: Firebase-Datenbankabfragen können nur nach einer einzelnen Eigenschaft sortieren/filtern. In vielen Fällen ist es möglich, die Werte, die Sie filtern möchten, in einer einzigen (synthetischen) Eigenschaft zu kombinieren. Ein Beispiel für diese und andere Ansätze finden Sie hier: http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase.

Verwandte Themen