Firestore中获取指定艺术家所有专辑失败,求助解决及结构优化
一、当前可以获取目标数据,先修正这些错误
你目前的代码无法获取到Rammstein的专辑,主要是几个细节问题:
集合/子集合名称不匹配
你描述的Firestore结构是Artists -> 艺术家名称 -> Albums of Artist Name -> Songs,但代码里用的是collection('artist')(单数)和collection("ArtistsAlbum"),如果Firestore后台实际的集合名是复数Artists,子集合名是Albums of Artist Name,名称写错会直接导致查询失败。查询逻辑错误
FirebaseFirestore.instance.collection('artist').doc("Rammstein").get()是获取Rammstein的艺术家文档本身,但你的专辑数据存在该文档下的子集合里,并非艺术家文档的字段中,所以直接get文档拿不到专辑数据,必须查询对应的子集合。
正确的查询代码示例
假设Firestore里的集合名是Artists,子集合名是Albums of Artist Name,用以下代码可以获取Rammstein的所有专辑ID:
Future getRammsteinAlbums() async { // 定位到Rammstein文档下的专辑子集合 final albumsSnapshot = await FirebaseFirestore.instance .collection('Artists') .doc("Rammstein") .collection("Albums of Artist Name") .get(); // 提取所有专辑ID final albumIds = albumsSnapshot.docs.map((doc) => doc.id).toList(); setState(() { docIDs = albumIds; }); }
另外,你原来的getDocId()代码存在冗余:遍历所有艺术家文档,但每次都只查询Artist1的专辑,完全没必要,直接针对目标艺术家查询即可。
二、关于数据结构的建议
你当前的Artists -> 艺术家名称 -> 专辑子集合 -> 歌曲结构是符合Firestore设计规范的,不需要改成Artist1->Albums->Songs、Artist2->Albums->Songs这种形式(本质和当前结构逻辑一致)。
不过可以做一个优化:把专辑子集合的名称统一为Albums,而不是Albums of Artist Name,这样代码更简洁,后续维护也更方便,结构变成:Artists -> 艺术家名称 -> Albums -> Songs
内容的提问来源于stack exchange,提问作者K01n

