Firebase 如何使用firestore绑定angularfire2中的多个查询结果?

Firebase 如何使用firestore绑定angularfire2中的多个查询结果?,firebase,google-cloud-platform,angularfire2,google-cloud-firestore,Firebase,Google Cloud Platform,Angularfire2,Google Cloud Firestore,我想使用一个集合来维护一些文档之间的关系,就像建议的那样(但方法略有修改)。我之所以选择收集方法,是因为随着时间的推移,文档属性似乎更具可伸缩性 我的实际数据结构 users user1 user2 companies co1 co2 user_co user1 companies (collection) co1 co2 user2 companies (collection)

我想使用一个集合来维护一些文档之间的关系,就像建议的那样(但方法略有修改)。我之所以选择收集方法,是因为随着时间的推移,文档属性似乎更具可伸缩性

我的实际数据结构

users
   user1
   user2

companies
   co1
   co2

user_co
   user1
       companies (collection)
           co1
           co2

   user2
       companies (collection)
           co1
但使用这种方法,我需要执行多个查询,以便为特定用户获取所有可用的公司,因为我们无法执行“in”子句

因此,我需要分两步检索数据:

  • 检索在
    user\u co/{user}/companys中有权访问的公司用户列表
  • /companys/{id}
  • 为什么是两步?因为我不想将所有公司的读取权限授予所有用户,查询
    /companys
    将触发访问错误

    因此,我很难从多个调用中检索到一个可绑定的文档列表

    我的组件中显示了2个项目,但未显示字段值。我检索/公司文档的方式肯定有问题

    任何帮助都将不胜感激

    MyService.ts

    接口公司{
    名称:字符串;
    业主:任何;
    身份证?:有;
    时间?:任何;
    creationTime?:任何;
    }
    接口公司{
    身份证?:有;
    名称:字符串;
    }
    @可注射()
    出口类公司服务{
    公司收藏:AngularFirestoreCollection;
    MyCompanies集合:AngularFirestoreCollection;
    我公司;
    建造商(专用afs:AngularFirestore,专用ats:AuthService){
    this.myCompaniesCollection=this.afs.collection('user_co').doc(this.ats.currentUserId)。collection('companys');
    this.myCompanies=this.myCompaniesCollection.snapshotChanges().map(操作=>{
    返回actions.map(a=>{
    //从这里检索/公司数据的好方法是什么?
    返回这个.afs.firestore.collection(“companys”).doc(a.payload.doc.id).get()。然后(doc=>{
    返回{id:doc.id,…doc.data()}
    }).catch(错误=>{
    console.log(“读取公司文档时出错:”,错误);
    });
    //从/user\u co返回数据的原始示例
    //返回{id:a.payload.doc.id,…a.payload.doc.data()}
    })
    });
    }
    getData(){
    返回此。myCompanies;
    }
    }
    

    使用angularfire2 5.0.0-rc.3和firebase 4.5.2,我终于改变了将数据存储到Firestore的方式

    如前所述,在许多与NoSQL相关的文档中,非规范化是避免“类似连接”和多个查询的方法

    使用非规范化可以将需要处理的所有数据分组 一个地方的查询。这通常意味着对于不同的查询流 相同的数据将以不同的组合访问。因此我们 需要复制数据,这会增加总数据量

    这样,我就可以简单地检索
    /users/{user}/companies
    ,并获得有关该用户所属公司的所有相关信息。而且不需要访问所有用户的所有公司信息(设置、用户等)

    新数据结构

    /users/{user}
        user_name
        /companies/{company}
           company_name
    
    /companies/{company}
        name
        /admins/{user}
        /users/{user}
            user_name
    
    允许管理员向公司邀请/添加用户的安全规则

    match /users/{usr}/companies/{co} {
        // Only visible to the actual user
        allow read: if request.auth.uid == usr;
    
        // Current user can opt-out of company
        allow delete: if request.auth.uid == usr ||
            // Company admin can add or drop-out a user
            exists(/databases/$(db)/documents/companies/$(co)/admins/$(request.auth.uid));
    
        // Company admin can add or drop-out a user
        allow create, update: if exists(/databases/$(db)/documents/companies/$(co)/admins/$(request.auth.uid));
    }
    
    match /companies/{co} {
        // Company accessible for members and admins only
        allow read: if
            exists(/databases/$(db)/documents/companies/$(co)/members/$(request.auth.uid)) || 
                exists(/databases/$(db)/documents/companies/$(co)/admins/$(request.auth.uid));
    
        match /admins/{usr} {
            // allow company creation if it does not exists
            allow create: if exists(/databases/$(db)/documents/companies/$(co)) == false
            // updates allowed for admins
            allow update, delete: if exists(/databases/$(db)/documents/companies/$(co)/admins/$(request.auth.uid));
        }
        match /users/{usr} {
          // writes allowed for admins
          allow write: if exists(/databases/$(db)/documents/companies/$(co)/admins/$(request.auth.uid));
        }
    }
    
    对应方

    更新
    /companys/{company}/[name]
    时,我还需要通过
    /companys/{company}/users
    检索属于该公司的所有用户,然后更新
    /users/{user}/companys/{company}
    中的所有文档。这可以在一个小时内完成