web-dev-qa-db-fra.com

Comment utiliser la requête Firebase equalTo (valeur, clé)?

En tant que novice dans firebase, j'ai essayé d'imiter une sorte de requête "where clause" pour récupérer le portefeuille de l'utilisateur dans ce cas d'utilisation simple:

User
   48bde8f8-3b66-40bc-b988-566ccc77335c
      email: "[email protected]"
      username: "userTest1"

UserWallet
   F4PvtvNT2Z
      coins: 26
      someList
         elemet1
         elemet2 
      user: "48bde8f8-3b66-40bc-b988-566ccc77335c"

J'ai d'abord essayé de coder ma demande comme ceci:

Firebase root = new Firebase("https://myApp.firebaseio.com/");
Firebase ref = root.child("UserWallet");
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

Le résultat était nul, alors j'ai écrit cette requête:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

Le résultat était à nouveau nul. Le seul moyen de récupérer le portefeuille était d'utiliser cette requête:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");

Donc, dois-je toujours utiliser la requête "orderByChild ()" avant d'utiliser "equalTo ()"? 
Et donc, quel est le but de la requête "equalTo (valeur de chaîne, clé de chaîne)" par rapport à "equalTo (valeur de chaîne) puisque seul le second fonctionne correctement?

16
ThierryC

Il existe des cas Edge qui n'ont pas besoin d'une orderBy...(), mais en général, vous aurez besoin d'une orderBy...() avant une opération de filtrage (equalTo(), startAt(), endAt()).

Je vous recommande vivement de lire au préalable le guide de programmation de Firebase pour Android (95% s’appliquent également à Java standard). Quelques heures passées dans ce guide vous éviteront des dizaines de questions. Par exemple: ceci est la section sur les requêtes .

Après avoir lu cela, vous pouvez aussi lire ce guide sur NoSQL Data Modeling . Il couvre de nombreux modèles courants dans la modélisation de données NoSQL et vous aidera à comprendre très tôt que tenter de mapper des requêtes SQL sur une base de données NoSQL est une idée logique, mais rarement bonne.

Mon modèle initial (sans aucune idée de vos cas d'utilisation, sauf pour le modèle "J'ai besoin de pouvoir trouver les portefeuilles d'un utilisateur"):

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"
         coins: 26
         someList
            element1
            element2 

Dans le modèle ci-dessus, j'ai inversé Wallet et User sous UserWallet, de sorte que la recherche du portefeuille d'un utilisateur devient plus facile.

ref.child('UserWallet').child(auth.uid).addValueEventListener(...

Notez qu'il n'y a pas de requête impliquée ici, donc le chargement sera aussi rapide que le nombre d'utilisateurs de votre base de données.

Ou bien:

User
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      email: "[email protected]"
      username: "userTest1"

Wallet
   "F4PvtvNT2Z"
      coins: 26
      someList
         element1
         element2 

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"

Maintenant, nous avons complètement aplati la structure. Pour déterminer les portefeuilles d'un utilisateur, accédez à UserWaller/$uid, puis chargez chaque portefeuille à partir de Wallets/$walletid. Ce sera peut-être un peu plus de code, mais ce sera extrêmement efficace (puisqu'il n'y a pas de requêtes impliquées).

8
Frank van Puffelen

Vous pouvez utiliser la requête imbriquée pour cela.! Si vous avez plusieurs identifiants aléatoires, vous pouvez facilement les comparer.! DatabaseReference reference = FirebaseDatabase.getInstance (). GetReference ();

    Query query = reference.child("user");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                // dataSnapshot is the "issue" node with all children with id 0
                for (DataSnapshot issue : dataSnapshot.getChildren()) {
                    // do something with the individual "issues"

Query query = reference.child("user").child(dataSnapshot.getKey().equals(YourData)));
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {






                }

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
0
Atif AbbAsi