Firestore запрашивает несколько документов из коллекции - PullRequest
1 голос
/ 11 апреля 2020

В Firestore у меня есть коллекция пользователей, и в каждом пользовательском документе хранится коллекция с именем «Избранное», которая содержит идентификаторы документов, помеченных как избранные (хранилища)

Например:

in users/2pfV9FbtwPYFmQHz3KU2BKmhMr82/favorites 
I have multiple documents such as 7F9COWGW3Ww8FWiH8VTA and 8b8WogHzpqCkw0ZxMjOw

Я хотел бы сделать запрос, который возвращает все документы с одинаковым docID из коллекции, называемой хранилищами, которая содержит эти 2 идентификатора и многие другие (которых нет в списке избранных)

A similar query will be
SELECT * FROM stores WHERE docID EXISTS IN favorites

Я мог бы использовать другой подход, чтобы получить обе коллекции и отфильтровать их вручную, но я использую адаптер Firebase RecyclerView, все отображаемые данные которого основаны на запросе и сделают вещи более эффективными.

Как это можно сделать результат будет достигнут? дайте мне знать, если потребуется дальнейшее объяснение

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Возможный ответ на мой вышеупомянутый вопрос состоит в том, чтобы получить все идентификаторы документов из коллекции Избранное и поместить их в список, а затем использовать функцию whereIn для объединения идентификаторов коллекции магазинов с идентификаторами списка избранных

Основная проблема - это полная потеря функциональности обновления в реальном времени при использовании Firebase RecyclerView

favoriteList = new ArrayList<>();
        favCollection.get() //get user favorites
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                favoriteList.add(0, document.getId());
                                Log.d("Favorites", document.getId() + " => " + document.getData());
                            }
                            query = storesCollection.whereIn(FieldPath.documentId(), favoriteList).orderBy("storeName");//FieldPath.documentId gives documents IDs in stores collection which will be filtered with the provided list
                            attachRecyclerViewAdapter();//Initiate adapter after favorites list completion
                        } else {
                            Log.d("Favorites", "Error getting documents: ", task.getException());
                        }
                    }
                });
1 голос
/ 11 апреля 2020

То, что вы запрашиваете, называется «объединением», и эти типы запросов не поддерживаются Firestore. Firestore может одновременно использовать документы из одной коллекции только в одном запросе. (Исключение составляют запросы групп собраний, которые могут использовать документы из нескольких собраний с одинаковыми именами).

Вам нужно будет выполнить запрос для всех документов в «избранном» и использовать результаты этот запрос по отдельности get() каждый связанный документ из "магазинов".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...