云公司的FireStore - 如何从两个集合获取相关数据?

Shahood UL哈桑:

我想定义云公司的FireStore这两个集合。一些样品的数据已被显示如下:

播放列表:

  • 名称: “playlist1”
  • songCount://要在实时计算

歌曲:

  • 标题:“松1”
  • playlistId: “playlist1”

  • 标题: “song2”

  • playlistId: “playlist1”

  • 标题: “song3”

  • playlistId: “playlist1”

此外,在我的Android应用程序,我想告诉所有的播放列表,所有歌曲的单独列表。然而,虽然显示了所有播放列表的列表,我要显示的每个播放列表非常久远的包含在每个歌曲的编号的名称,基于在“songCount”的值。

请指教排序查询我需要在云公司的FireStore使实现这一目标的。是否有JOIN功能可用或我将不得不把歌曲集合在一个循环和计数有playlistId为“playlist1”的那些,然后重复它为所有在播放列表中被呈现的播放列表?我想有一个聪明的解决方案,但无法找到一个在互联网上。

任何帮助将是一个很大的帮助。谢谢你的时间。

亚历克斯·马莫:

是否有加入的功能是否可用?

不幸的是,没有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-Realtime-Database-root
    |
    --- playlists
          |
          --- playListIdOne: numberOfSongs
          |
          --- playListIdTwo: numberOfSongs

编辑:

我不能说,因为第一个答案涉及公司的FireStore和第二个涉及火力地堡实时数据库,我的理解是完全特别。

我给你这个解决方案,因为如果你想使用云计算公司的FireStore计算和更新的元素每次一首歌曲被添加或删除,你会被公司的FireStore为每个写入/删除操作进行充电。火力地堡实时数据库还有一个定价计划,所以你不会被收取了点。查看公司的FireStore定价请直到结束时再次读取,从此我的答案

另外,我也没有真正得到的程序计算的歌曲数量。

这是你如何可以从公司的FireStore获得的歌曲数量,并将其写入到火力地堡实时数据库:

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是一种常见的做法,当涉及到火力地堡。为了更好地理解,我建议你看到这段视频,非规范化是正常的与火力地堡数据库它是火力地堡实时数据库中,但规则同样适用于云计算公司的FireStore。

同样,当你重复的数据,有一件事,你需要牢记。在您添加数据以同样的方式,你需要保持它。换句话说,如果你想更新/删除一个项目,你需要做的是在每一个地方,它的存在。

记住一个相同的歌曲可以在多个播放列表中找到。

不要紧,因为每首歌都有不同的ID。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在移动云计算公司的FireStore文档?

如何从Firestore中的两个集合中获取数据?

火力地堡云公司的FireStore:无效的集合引用。集合引用,必须是单数段

我怎样才能从云公司的FireStore从阵列中的数据字段的数据?

如何将用户在云计算公司的FireStore特定活动重定向?

填充Androidx RecyclerView与CardView从火力地堡公司的FireStore两个集合的数据

如何获得特定集合在公司的FireStore?

如何与Android分页公司的FireStore?

如何从 firestore 两个集合中获取数据并将所有数据合并在一起

公司的FireStore - 合并当地的两个查询

如何在React Native中显示来自两个Firestore集合的数据

如何通过 Firestore 中的引用字段连接来自两个集合的数据?

我如何使用 firestore 和 flutter 在两个不同的集合中添加数据

检索复杂的文件从云公司的FireStore

云公司的FireStore:DexArchiveMergerException无法合并DEX

如何使用两个Firestore集合制作ArrayList?

如何从 Firestore 检索两个集合下的节点?

如何查询queryDocumentSnapshot公司的FireStore的文件场内

如何减少的数量在公司的FireStore采集读取?

如何排除从公司的FireStore查询的元素?

如何获得对象从公司的FireStore数组

如何设置外键在公司的FireStore?

如何在React Native中使用两个Firestore查询获取数据

Firestore查询-连接两个集合

使用“阵列包含”查询云公司的FireStore社会媒体结构

从 Firestore 集合中获取多个文档时搜索两个查询

如何在公司的FireStore链查询,等待数据检索

如何从Android的公司的FireStore查询最近7天的数据

如何与Android一RecyclerView显示来自公司的FireStore数据?