栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Cloud Firestore-如何从两个集合中获取关系数据?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Cloud Firestore-如何从两个集合中获取关系数据?

是否有加入功能?

不幸的是,

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
对象。如果要获取与特定播放列表对应的所有歌曲,只需将一个侦听器附加到
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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号