update - swift firebase realtime




Interrogation dans Firebase par l'enfant de l'enfant (2)

J'ai une structure d'objets dans Firebase qui ressemble à ceci:

-KBP27k4iOTT2m873xSE
    categories
        Geography: true
        Oceania: true
    correctanswer: "Yaren (de facto)"
    languages: "English"
    question: "Nauru"
    questiontype: "Text"
    wronganswer1: "Majuro"
    wronganswer2: "Mata-Utu"
    wronganswer3: "Suva"

J'essaie de trouver des objets par catégories, par exemple je veux tous les objets qui ont la catégorie "Océanie".

J'utilise Swift et je ne peux pas vraiment saisir le concept de comment interroger les données.

Ma requête ressemble à ceci:

ref.queryEqualToValue("", childKey: "categories").queryOrderedByChild("Oceania")

ref est la référence à Firebase dans ce chemin spécifique.

Cependant, peu importe ce que j'ai essayé, je garde toujours TOUTES les données retournées à la place des objets avec la catégorie Océanie seulement.

Mes données sont structurées comme ceci: baseurl/questions/

Comme vous pouvez le voir dans l'exemple d'une question, plusieurs catégories peuvent être ajoutées, donc d'après ce que j'ai compris, il est préférable d'avoir une référence aux catégories à l'intérieur de vos objets.

Je pourrais changer ma structure en baseurl/questions/oceania/uniqueids/ , mais j'obtiendrais alors plusieurs entrées couvrant les mêmes données, mais avec des uniqueid , parce que la question serait présente sous les deux catégories oceania et geography .

En utilisant la structure baseurl/questions/oceania/ et baseurl/questions/geography je pourrais aussi ajouter unique ids sous oceania et geography qui pointent vers un unique id spécifique à l'intérieur de baseurl/questions/uniqueids , mais cela signifierait que j'aurais pour garder une trace de beaucoup de références. Faire une table de relations pour ainsi dire.

Je me demande si c'est le chemin à parcourir ou? Dois-je restructurer mes données? L'application n'est pas encore en production, donc il est possible de restructurer les données complètement sans conséquences plus importantes, à part que je devrais réécrire mon code, qui pousse les données vers Firebase.

Faites-moi savoir, si tout cela n'a pas de sens et désolé pour le mur de texte :-)


Je pense que cela devrait fonctionner:

ref.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)

Ajout de code supplémentaire à la réponse de Tim pour référence future.

Utilisez simplement une requête profonde. La clé de l'objet parent n'est pas ce qui est demandé, c'est donc «ignoré». Peu importe que ce soit une clé générée par autoId ou un nom de dinosaure - la requête est sur les objets enfants et le parent (clé) est retourné dans snapshot.key.

En fonction de la structure de votre base de données Firebase, vous récupérez chaque noeud enfant où l'Océanie est vraie, une à la fois:

      let questionsRef = Firebase(url:"https://baseurl/questions")
      questionsRef.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)
            .observeEventType(.ChildAdded, withBlock: { snapshot in
               print(snapshot)
        })

Edit: Une question a été soulevée concernant le chargement de toutes les valeurs à la fois (.value) au lieu d'une à la fois (.childAdded)

      let questionsRef = Firebase(url:"https://baseurl/questions")
      questionsRef.queryOrderedByChild("categories/Oceania").queryEqualToValue(true)
              .observeSingleEventOfType(.Value, withBlock: { snapshot in
              print(snapshot)
       })

Résultats dans (ma structure Firebase est un peu différente, mais vous avez l'idée) uid_1 n'a pas Oceania = true, donc il a été omis dans les résultats de la requête.

Snap (users) {
    "uid_0" =     {
        categories =         {
            Oceania = 1;
        };
        email = "[email protected]";
        "first_name" = Bill;
    };
    "uid_2" =     {
        categories =         {
            Oceania = 1;
        };
        "first_name" = Peter;
    };
}




firebase