如何根据Firestore中的子集合文档值返回父集合?

时间:2020-09-22 14:12:45

标签: javascript firebase google-cloud-firestore

我的Firestore中有此收藏集:

Collection: Team1
  Document: TeamName
    Subcollection: Notes
    Subcollection: Users    
       Document: user1 => Field: name: "Anna", uid: "someID"
       Document: user2 => Field: name: "John", uid: "someID"

让我们想象一个场景,其中有许多具有以上模式的Team集合。如何基于文档(在“用户”子集合中)的“名称”字段,使用JavaScript返回整个Team集合(以便我可以访问例如Notes)。

我尝试过:

 var nameRef = db
    .collection('Team1')
    .doc('TeamName')
    .collection('Users')
    .where('name', '==', 'Anna')

const getData => ()=> {
  nameRef.get().then((snapshot) => {
      snapshot.docs.forEach((doc) => {
        console.log(doc.data())
      })
    })
}

但是上面的代码仅输出用户文档中的文档字段(名称,uid)。

2 个答案:

答案 0 :(得分:1)

您的查询将仅返回Users集合中的文档。如果您还想显示用户的数据,则需要分别加载他们的文档。对于TeamName用户,应为:

db
  .collection('Team1')
  .doc('TeamName')
  .get()

或者,您也可以使用以下方法确定并获取用户的父文档:

doc.ref.parent.parent.get()

如果要在所有团队中搜索名为Anna的用户,则可以使用集合组查询。这是一种特殊的查询类型,可以搜索具有特定名称的所有集合。

var nameRef = db
    .collectionGroup('Users')
    .where('name', '==', 'Anna')

const getData => ()=> {
  nameRef.get().then((snapshot) => {
      snapshot.docs.forEach((doc) => {
        console.log(doc.data())
      })
    })
}

在这里,这只会加载用户,而不是他们的团队。但是您可以使用与之前相同的doc.ref.parent.parent.get()代码段,然后还可以为每个用户查找并加载团队文档。

答案 1 :(得分:1)

除了.data()方法之外,检索到的doc还具有一个.parent属性,该属性包含CollectionReference-在这种情况下,它将引用您的Users集合。该集合还具有一个.parent属性,该属性将指向您的TeamName文档。它的父项将指向您的Team1集合。

使用文档和集合的这些父属性,您可以将树“向上”移动到团队集合中,以在其上检索其文档。