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}
中的所有文档。这可以在一个小时内完成