Firebase - Comment puis-je écrire plusieurs orderByChild pour l'extraction des données?
Je suis à la recherche pour obtenir des données où les deux champs égal à ce que je suis de passage dans.
Voici un exemple de mon code:
this.refApp
.orderByChild('userUid')
.startAt(uid).endAt(uid)
.orderByChild('jobId')
.startAt(jobId).endAt(jobId)
.on('value', (snap) => {
//This currently doesn't get returned.
});
Dans l'exemple ci-dessus je n'ai pas toutes les erreurs du compilateur et le code semble très bien.
Cependant, j'ai codé en dur les données de sorte qu'il serait de retour d'un objet où l'uid et le jobid sont égaux.
Je peux obtenir que cela fonctionne pour un orderByChild mais quand je fais les deux, comme ci-dessus, il ne semble pas faire quoi que ce soit.
- Voir stackoverflow.com/questions/33336697/..., stackoverflow.com/questions/27432030/..., stackoverflow.com/questions/32538312/...
- Un autre scénario simple, je suis coincé avec est, par exemple, je veux la liste de mes contacts par nom puis par prénom. Comment faites-vous cela dans Firebase?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez utiliser qu'une méthode de classement.
À la requête, vous aurez besoin de repenser la structure de données. Votre structure actuelle ressemble probablement à quelque chose comme ceci:
Avec cette structure, vous êtes limité à indice d'une clé enfant.
Maintenant considérer cette structure:
Cette structure explicitement la création d'un index sur
uid
. Alors maintenant, si vous voulez obtenir tous les emplois par l'utilisateur vous pouvez écrire cette requête:Une autre façon de faire le genre de plusieurs
orderByChild
dans Firebase est de créer un orderKey.Imaginez que vous avez dans votre base:
Et que vous souhaitez requête:
userRef.orderByChild('firstName').equalTo('Jon').orderByChild('lastName').equalTo('Snow')
Vous devez créer une clé de votre utilisateur comme ceci:
De sorte que vous pouvez requête comme ceci:
userRef.orderByChild('orderName').equalTo('JonSnow')
Cela fonctionne également avec les
startAt
etendAt
si vous souhaitez interroger la Neige né dans une série d'années. Vous créez d'abord la clé:De sorte que vous pouvez interroger:
userRef.orderByChild('orderNameYear').startAt('Snow280').endAt('Snow285')
Ce sera le retour de la Neige nés entre 280 et 285.
Il n'est pas pris en charge.
Selon le type de requête que vous devez exécuter sur une entité, vous devrez la boutique vous des emplois par l'utilisateur comme @david-est suggéré ou ajouter une propriété en combinant les deux propriétés:
Mais généralement, il n'existe aucun moyen pour permettre à toutes les requêtes que vous avez besoin. Soit vous avez de filtrer les objets sur le côté client, ou de dupliquer les données créées vue différente des données; vous aurez l'emploi les données enregistrées à
/jobs/$jobId
,/users/$userId/jobs/$jobId
et peut-être/pendingJobs/$jobId
.Je trouve que c'est plus facile d'utiliser le orderBy* méthode uniquement pour la commande d'entités et de dupliquer les données pour sélectionner des sous-ensembles d'entre eux.
Je souhaite Firebase serait en charge les index combinant plusieurs propriétés, mais pour l'instant vous avez besoin pour construire ces vous-même. Cependant, ayant différents points de vue permet d'appliquer des règles de sécurité différentes à eux: par exemple, un utilisateur doit avoir accès à
/users/$userId/jobs/
, seul l'administrateur doit avoir accès à/jobs/$jobId
.