【问题标题】:Firebase firestore nested queryFirebase Firestore 嵌套查询
【发布时间】:2019-09-16 13:39:40
【问题描述】:

我有一个这样的 Firestore 数据库结构:

Songs:
    - song1
         - artistName
         - songCover 
    - song2
    - song3

我希望能够抓取所有收藏过特定歌曲的用户

过去我做了如下结构

FavoriteSongs
     - IDSong1
            - userID1 (with favorited the song)
                - artistName
                - songCover
            - userID2
Songs:
     - song1
       - artistName
       - songCover

在之前的结构中,我在用户的 id 节点中制作了每首歌曲的精确副本。但是,当一首歌曲更改其封面时,这会迫使我更改 FavoritedSongs 中的每个文档,其中更改的歌曲的 ID 与 FavoriteSongs 的 IDSong 键匹配。

阅读有关集合组查询的信息,我想我可以这样做:

Songs:
        - song1
             - artistName
             - songCover 

             -> Favorited (Subcollection):
                   - userID1

        - song2
        - song3

这样我可以检索特定用户收藏的所有歌曲,并且可以获取包含所有更新值的歌曲,因为更改歌曲的封面只会影响一个文档。

这可能吗,如果可以,我该如何编写查询?

【问题讨论】:

  • 请检查副本。这与您所说的完全相同的“问题”。
  • @AlexMamo 这个问题询问如何在给定现有数据库结构的情况下编写集合组查询。我看不出它是重复的。
  • @DougStevenson 哦,是的,你是对的。我错过了那条线。感谢您重新提出问题。
  • @AlexMamo 我不明白所提供的答案,因为我在查询firestore.collectionGroup("favorited").where("favorited", "==", true) 中的确切位置指定了我想要获取他们喜爱的歌曲的用户。另外,这个查询是返回Song 文档还是Favorited 集合中的文档?
  • @Andrea 我认为你应该问问 Doug。很抱歉早些时候结束了这个问题。我错过了集合组查询的那部分。

标签: firebase google-cloud-firestore


【解决方案1】:

如果您想编写一个集合组查询,在某些文档属性(也称为“收藏”)为真的子集合(名为“收藏”)中查找文档:

firestore.collectionGroup("favorited").where("favorited", "==", true)

每个用户都需要能够在子集合中使用与其 UID 相同的 ID 编写自己的文档,才能设置此布尔属性。因此,要标记收藏夹,用户会:

firestore
    .collection("songs")
    .doc(songId)
    .collection("favorited")
    .doc(userId)
    .set({ favorited: true })

【讨论】:

  • 快速提问,之前的方案是返回用户收藏的歌曲列表,还是返回收藏夹中的文档?我在查询中的哪个位置只限制获取特定用户最喜欢的歌曲?
  • 找到的每个文档都将在其完整路径中包含所收藏歌曲的 ID。您可以通过查看文档的引用从那里提取它。
  • 如果您想按用户进行限制,您还必须将用户 ID 作为文档中的一个字段,并将其添加到 where 子句中。
猜你喜欢
  • 2018-05-23
  • 2019-07-18
  • 2018-10-16
  • 2018-11-26
  • 1970-01-01
  • 2020-11-18
相关资源
最近更新 更多