是否有加入功能?
不幸的是,
JOINFirestore中没有查询。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对象。如果要获取与特定播放列表对应的所有歌曲,只需将一个侦听器附加到
songsplayListIdplayListSongs并获取所有
song对象即可。
关于与播放列表相对应的所有歌曲的计数,建议您从本
帖子中
看到我的答案,在此我已经解释了可以实现的目标。因此,根据我回答的最后一部分,您的Firebase实时数据库结构应如下所示:
Firebase-Realtime-Database-root | --- playlists | --- playListIdOne: numberOfSongs | --- playListIdTwo: numberOfSongs
编辑:
我不能说我已经完全理解它,尤其是因为第一个答案涉及Firestore,第二个答案涉及Firebase Realtime Database。
我给您提供此解决方案是因为,如果您希望每次添加或删除歌曲时都使用Cloud
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实时数据库,但相同的规则适用于Cloud
Firestore。
此外,在复制数据时,需要记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您要更新/删除项目,则需要在项目存在的每个位置进行。
请记住,同一首歌曲可以在多个播放列表中找到。
没关系,因为每首歌都有不同的ID。



