web-dev-qa-db-fra.com

Comment récupérer des documents d'une sous collection dans Firestore?

J'ai un db avec la structure comme dans l'image ci-dessous:  enter image description here

Ici, il me faut plusieurs marques, ainsi que plusieurs sous-marques sous chaque marque. J'ai déjà essayé avec des «cartes» auparavant, mais c'était vraiment compliqué et j'ai aussi appris qu'il était préférable d'avoir plusieurs documents. Je suis très novice dans ce domaine et lutte depuis 3-4 jours maintenant. Toute aide serait très appréciée.

  firebaseFirestore.collection("Coffee").addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            if (e != null) {
                Log.d(TAB, "Error : " + e.getMessage());
            }
            for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
                if (doc.getType() == DocumentChange.Type.ADDED) {
                    Log.d("Brand Name: ",doc.getDocument().getId());

                  //  how to retrieve documents of subCollection here? something like doc.getDocument().collection??

                }

            }

        }
    });

Je vous remercie.

6
nandu

C'est très simple et facile essayez ceci.

 firebaseFirestore.collection("Coffee").addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            if (e != null) {
                Log.d("", "Error : " + e.getMessage());
            }
            for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
                if (doc.getType() == DocumentChange.Type.ADDED) {
                    Log.d("Brand Name: ", doc.getDocument().getId());
                    doc.getDocument().getReference().collection("SubBrands").addSnapshotListener(new EventListener<QuerySnapshot>() {
                        @Override
                        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
                            if (e != null) {
                                Log.d("", "Error : " + e.getMessage());
                            }

                            for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
                                if (doc.getType() == DocumentChange.Type.ADDED) {
                                    Log.d("SubBrands Name: ", doc.getDocument().getId());
                                }
                            }

                        }
                    });
                }

            }
        }});

Note : J'ai mis à jour la réponse. Il est évident que vous ne pouvez pas extraire des sous-collections dans le document de la collection avec une seule demande.

3
Nouman Ch

Je vois que la réponse est déjà acceptée, mais je tiens à vous fournir un moyen plus élégant de structurer votre base de données. Cela signifie que vous pourrez également récupérer les données plus facilement. Auparavant, si j'ai bien compris votre question, vous souhaitez uniquement récupérer des données. Pour ce faire, utilisez simplement un appel get(). addSnapshotListener() est utilisé pour récupérer les données real time.

Voici la structure de base de données que je vous suggère d'utiliser pour votre application:

Firestore-root
   |
   --- coffee (collection)
         |
         --- coffeeId (document)
                |
                --- coffeeBrand: "Nescafe"
                |
                --- coffeeSubBrand: "Sunrise"
                |
                --- coffeeName: "CoffeeName"
                |
                --- quantity
                       |
                       --- 50g: true
                       |
                       --- 100g: true
                       |
                       --- 150g: true

Bien que le code de Nouman Ch puisse fonctionner sur votre structure de base de données réelle, cette nouvelle structure vous permettra d'éviter les boucles imbriquées. Pour obtenir tous les cafés, utilisez simplement le code suivant:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference coffeeRef = rootRef.collection("coffee");
coffeeRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (DocumentSnapshot document : task.getResult()) {
                String coffeeName = document.getString("coffeeName");
                Log.d("TAG", coffeeName);
            }
        }
    }
});

Si vous souhaitez afficher uniquement le Nescafe coffee, au lieu d'utiliser une CollectionReference, vous devez utiliser une Query:

Query query = coffeeRef.whereEqualTo("coffeeBrand", "Nescafe");

Si vous souhaitez afficher uniquement les sous-marques café, utilisez la requête suivante:

Query query = coffeeRef.whereEqualTo("coffeeSubBrand", "Sunrise");

Si vous souhaitez afficher les marques de café et les sous-marques, vous pouvez chaîner des méthodes telles que:

Query query = coffeeRef
    .whereEqualTo("coffeeSubBrand", "Sunrise")
    .whereEqualTo("coffeeBrand", "Nescafe");

Si vous souhaitez afficher uniquement le café avec la quantité de 100g, utilisez simplement la requête suivante:

Query query = coffeeRef.whereEqualTo("quantity.100g", true);

Si vous souhaitez en savoir plus sur les structures de base de données Cloud Firestore, vous pouvez consulter l'un de mes tutoriels.

0
Alex Mamo