我的数据的结构如下:
collection(people)
document (UserId1)
collection(profiles)
document (generatedId1)
name: 'Speech1'
type: 'admin'
document (UserId2)
collection(profiles)
document (generatedId2)
name: 'Client1'
type: 'client'
collection(tasks)
document (generatedId3)
date: '2018-12-30'
time: 'AM'
severity: 0
document (generatedId4)
date: '2018-12-30'
time: 'PM'
severity: 0
document (UserId3)
collection(profiles)
document (generatedId5)
name: 'Client2'
type: 'client'
collection(tasks)
document (generatedId5)
date: '2018-12-30'
time: 'AM'
severity: 0
document (generatedId6)
date: '2018-12-30'
time: 'PM'
severity: 0
此结构允许我使用以下语句查询登录用户的任务集:
getTasks(){
return new Promise<any>((resolve, reject) => {
let currentUser = firebase.auth().currentUser;
this.snapshotChangesSubscription = this.afs.collection('people').doc(currentUser.uid).collection('tasks').snapshotChanges()
.subscribe(snapshots => {
resolve(snapshots);
})
});
}
但是,当我以管理员类型用户登录时,我希望查看所有用户的数据,因此我试图构造和查询实质上要考虑到人员集合中的所有文档的
。我该怎么做?
答案 0 :(得分:0)
但是,当我以管理员类型用户登录时,我希望查看所有用户的数据,因此我试图构造和查询实质上要考虑到人员集合中的所有文档的
。我该怎么做?
不幸的是,您不能使用此数据库模式。 Firestore中的查询很浅,这意味着它们仅从查询所针对的集合中获取项目。无法通过单个查询从顶级集合以及其他集合或子集合中获取文档。 Firestore不一次性支持跨不同集合的查询。单个查询只能使用单个集合中的文档属性。因此,我能想到的最简单的解决方案是添加另一个集合,您应在其中添加所有people collection -> uid -> generatedId
中存在的所有子集合中的所有“文档”。因此,您的架构可能类似于以下内容:
Firestore-root
|
--- allDocuments (collection)
|
--- generatedId1 (document) //The unique id of the document
| |
| --- name: 'Speech1'
| |
| --- type: 'admin'
| |
| --- uid: 'UserId1'
|
--- generatedId 2(document) //The unique id of the document
|
--- name: 'Client1'
|
--- type: 'client'
|
--- uid: 'UserId2'
为了显示所有这些用户,只需在allDocuments
引用上附加一个侦听器并获取所有users
对象。如果要获取所有管理员用户,只需使用如下所示的Query
:
var allDocumentsRef = db.collection("allDocuments");
var query = allDocumentsRef.where("type", "==", "admin");