2017-09-29 3 views
1

Je construis une application de jeu en utilisant Firebase et Swift, et stocke mes données comme ceci.Filtrage et tri par un enfant spécifié dans Firebase

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

Il y a deux questions que je dois faire en fonction du score:

  • Obtenir les 5 meilleurs joueurs d'une seule catégorie.
  • Obtenez le top 100 des meilleurs joueurs du jeu.

J'ai aucun problème à obtenir les données pour la première requête, en utilisant

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

Mais je vais avoir du mal à déterminer la deuxième requête. Comment puis-je le faire efficacement?

+0

Vous ne savez pas qui a annulé cela, car cela semble être une question valide. Je contre-upvoted. –

+0

Est-il acceptable pour vous que vous modifiez la structure de votre base de données? Je pense que si vous changez la structure, ce serait facile – 3stud1ant3

+0

Oui, la structure peut être modifiée. –

Répondre

0

Vous devrez soit ajouter une structure de données supplémentaire pour autoriser la deuxième requête (ce qui est assez courant dans les bases de données NoSQL), soit modifier votre structure actuelle pour autoriser les deux requêtes. Ce dernier pourrait être accompli en transformant les données en une seule liste plate, avec quelques propriétés synthétiques supplémentaires. Par exemple.

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

Avec les nouvelles propriétés supplémentaires category et category_score, vous pouvez obtenir les meilleurs buteurs pour une catégorie avec:

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

Et les 100 scores globaux avec les meilleurs:

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

Pour plus à ce sujet, voir ma réponse ici: Les requêtes de base de données Firebase peuvent seulement commander/filtrer sur une seule propriété. Dans de nombreux cas, il est possible de combiner les valeurs que vous souhaitez filtrer en une seule propriété (synthétique). Pour un exemple de cette approche et d'autres, voir ma réponse ici: http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase.