Firestoreにはusersコレクションがあり、各ユーザードキュメント内には、favorites(stores)としてマークされたドキュメントのIDを含むfavoritesという名前のコレクションが格納されています。
例えば:
in users/2pfV9FbtwPYFmQHz3KU2BKmhMr82/favorites I have multiple documents such as 7F9COWGW3Ww8FWiH8VTA and 8b8WogHzpqCkw0ZxMjOw
これらの2つのIDとそれ以上(お気に入りリストにない)を含むstoresというコレクションから同じdocIDを持つすべてのドキュメントを返すクエリを作成したいと思います。
A similar query will be
SELECT * FROM stores WHERE docID EXISTS IN favorites
別の方法で両方のコレクションを取得して手動でフィルタリングすることもできますが、表示されるすべてのデータがクエリに基づいており、処理が効率化されるFirebaseRecyclerViewアダプターを使用しています。
どのようにしてそのような結果を達成することができますか?さらに説明が必要な場合はお知らせください
上記の質問に対する考えられる答えは、お気に入りコレクションからすべてのドキュメントIDを取得してリストに入れ、whereIn関数を使用してストアコレクションIDをお気に入りリストIDに結合することです。
主な問題は、FirebaseRecyclerViewを使用するとリアルタイム更新機能が完全に失われることです
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());
}
}
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加