我的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)。
答案 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
集合。
使用文档和集合的这些父属性,您可以将树“向上”移动到团队集合中,以在其上检索其文档。