私はクラウドFirestoreでこれらの2つのコレクションを定義したいです。いくつかのサンプルデータを以下に示すされています。
プレイリスト:
- 名前: "playlist1"
- songCount://をリアルタイムに計算します
曲:
- タイトル: "song1"
playlistId: "playlist1"
タイトル: "song2"
playlistId: "playlist1"
タイトル: "song3"
- playlistId: "playlist1"
さらに、私のAndroidアプリでは、私はすべてのプレイリストとすべての曲の別々のリストを表示したいです。しかし、すべてのプレイリストの一覧を表示しながら、私は「songCount」の値に基づいてそれぞれに含まれる曲数を伴って含む各プレイリストの名前を、表示したいです。
並べ替えクエリの私は、この目的を達成するために、クラウドFirestoreに行うために必要なものを教えてください。そこにあるJOIN
機能が利用できるか、私はループの中で曲のコレクションを入れて、「playlist1」としてplaylistIdを持つものをカウントして、プレイリストのリストに表示されるすべてのプレイリストのためにそれを繰り返さなければならないでしょうか?私は賢く解決策を持っていると思いますが、インターネット上のものを見つけることができませんでした。
すべてのヘルプは大きな助けになります。御時間ありがとうございます。
参加機能はありますか?
残念ながら、そこではありませんJOIN
Firestoreでクエリ。Firestoreでのクエリは浅いです:彼らは唯一のクエリはに対して実行されていることをコレクションから項目を取得します。単一のクエリでトップレベルのコレクションや他のコレクションまたはサブコレクションからドキュメントを取得する方法はありません。Firestoreは一度に異なるコレクション間でクエリをサポートしていません。単一のクエリは、単一のコレクション内のドキュメントのプロパティを使用することができます。私は考えることができる最も簡単な解決策は、データベース構造を使用することですので、このようになります。
Firestore-root
|
--- playlists (collection)
| |
| --- playListId (document) //The unique id of the play list
| |
| --- name: "playlist1"
|
--- songs (collection)
|
--- playListId (document) //The same as the above playListId
|
--- playListSongs
|
--- songId
|
--- title: "song1"
すべてのプレイリストを表示するためには、ちょうどにリスナーを添付playlists
参照し、すべてを取得playlist
するオブジェクトを。あなたが特定のプレイリストにすべての曲対応を取得したい場合は、単ににリスナーを添付songs\playListId\playListSongs
し、すべてを取得song
するオブジェクトを。
プレイリストにすべての曲その対応のカウントに関しては、私はあなたがここから私の答えを参照してくださいお勧めポスト私はあなたがこれを達成することができますどのように説明してきました、。私の答えの最後の部分に応じて、あなたのFirebaseリアルタイムデータベースの構造は次のようになります。
Firebase-Realtime-Database-root
|
--- playlists
|
--- playListIdOne: numberOfSongs
|
--- playListIdTwo: numberOfSongs
編集:
最初の答えはFirestoreを含み、第二はFirebaseリアルタイムデータベースを必要とするので、私は、私は特にそれを完全に理解してきたと言うことはできません。
あなたがカウントするクラウドFirestoreを使用すると、更新要素が曲を毎回場合は追加または削除されたので、私はあなたがすべての書き込み/削除操作のためFirestoreによって課金されます、あなたにこの溶液を得ました。Firebaseリアルタイムデータベースは別の持っている価格設定計画を、あなたはそれのために充電されないでしょう。参照Firestoreは、価格、最後まで再びこのことから私の答えをお読みくださいポストを。
また、私は本当に歌の数を計算するための手順を取得できませんでした。
これは、あなたがFirestoreから曲の数を取得し、Firebaseリアルタイムデータベースに書き込むことができる方法です。
rootRef.collection("songs").document(playListId).collection("playListSongs")
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
Log.d("TAG", task.getResult().size() + "");
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playListIdRef = rootRef.child("playlists").child(playListId);
playListIdRef.setValue(task.getResult().size());
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
そして、これはあなたが読むことができる方法です。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playListIdRef = rootRef.child("playlists").child(playListId);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long playListIdOne = dataSnapshot.getValue(String.Long);
Log.d(TAG, "playListIdOne: " + playListIdOne);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
playListIdRef.addListenerForSingleValueEvent(valueEventListener);
第二に、あなたの提案構造ごとに、どのように私はすべてのプレイリスト間ですべての曲のリストを得るでしょうか?
このケースでは、という名前の別のコレクションを作成する必要がありますallSongs
。データベースの追加のコレクションは、次のようになります。
Firestore-root
|
--- allSongs
|
--- songId
|
--- //song details
このような行為は、と呼ばれdenormalization
、それがFirebaseに来るとき、一般的な方法です。より良く理解するために、私はあなたがこのビデオを見るお勧めし、非正規化は、Firebaseデータベースと正常です。それはFirebaseリアルタイムデータベースのためであるが、同じ規則は、クラウドFirestoreに適用されます。
あなたは、データを複製する場合にも、あなたが心に留めておく必要があることを一つのことがあります。あなたがデータを追加しているのと同じ方法で、あなたはそれを維持する必要があります。あなたがアイテムを削除/更新したい場合は言い換えれば、あなたはそれが存在していることをすべての場所でそれを行う必要があります。
1つの同じ曲が複数のプレイリストで見つけることができることを念頭に置い。
それぞれの曲が異なるIDを持っているので、それは問題ではありません。