在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适配器,该适配器显示的所有数据均基于查询,这将使效率更高。
如何获得这种结果?让我知道是否需要进一步的解释
答案 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());
}
}
});