Firestore从集合中查询多个文档

时间:2020-04-11 19:00:38

标签: android firebase google-cloud-firestore

在Firestore中,我有一个用户集合,并且在每个用户文档中存储了一个名为“收藏夹”的集合,其中包含标记为“收藏夹(存储)”的文档ID。

例如:

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

我想查询一个查询,该查询从名为stores的集合中返回所有具有相同docID的文档 其中包含这2个ID以及更多ID(“收藏夹”列表中没有)

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

我可以采用另一种方法来获取两个集合并手动对其进行过滤,但是我使用的是Firebase RecyclerView适配器,该适配器显示的所有数据均基于查询,这将使效率更高。

如何获得这种结果?让我知道是否需要进一步的解释

2 个答案:

答案 0 :(得分:1)

您要的内容称为“联接”,Firestore不支持这些类型的查询。 Firestore一次只能在单个查询中使用单个集合中的文档。 (例外是集合组查询,可以使用来自多个具有相同名称的集合的文档)。

您要做的是查询“收藏夹”中的所有文档,并使用该查询的结果分别final _scrollThreshold = 200; void _onScroll() { final maxScroll = _scrollController.position.maxScrollExtent; final currentScroll = _scrollController.position.pixels; if (maxScroll - currentScroll <= _scrollThreshold) { BlocProvider.of<SearchBloc>(context).add(SearchPosts( pageNo: _pageNo++, query: _searchText.text )); } } “存储”中的每个相关文档。

答案 1 :(得分:1)

我上述问题的可能答案是从“收藏夹”集合中获取所有文档ID,并将它们放入列表中 然后使用whereIn函数将商店集合ID与收藏夹列表ID结合起来

主要问题是使用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());
                        }
                    }
                });