使用Cloud Firestore的Ionic App-查看所有用户的数据

时间:2019-01-01 04:36:37

标签: javascript firebase ionic3 google-cloud-firestore

我的数据的结构如下:

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);
      })
    });
  }

但是,当我以管理员类型用户登录时,我希望查看所有用户的数据,因此我试图构造和查询实质上要考虑到人员集合中的所有文档的

我该怎么做?

1 个答案:

答案 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");