我有一个带有3个集合的Firebase Cloud Firestore数据库;站点,团体和团体。组可以与许多站点相关联,因此可以集体矿场集合。如果有组ID,我想通过其组成员资格检索关联的站点。数据看起来像这样:
Sites:
- Id: ByBWwnFVXqnJO8FL5n2y
- SiteName: Penrith
- Supervisor: Bob
- Address: zzz site address
- Id: Hfui74ytBBzUw3OjIg1f
- SiteName: Keswick
- Supervisor: Bill
- Address: yyy site address
- Id: KKeQen0P3npldFVzt7fG
- SiteName: Browns Plains
- Supervisor: Tony
- Address: xxx site address
Groups:
- Id: iAX0GE9ZRU0AuxXMBkid
- GroupName: Group 1
- isPublic: 0
GroupSites:
- Id: jxpvUYkopOXNhKisYznC
- siteId: ByBWwnFVXqnJO8FL5n2y
- groupId: iAX0GE9ZRU0AuxXMBkid
- Id: p0jq3clihb0JRjhH5qon
- siteId: Hfui74ytBBzUw3OjIg1f
- groupId: iAX0GE9ZRU0AuxXMBkid
所以,例如,如果我拥有" IAX0GE9ZRU0AUXXMBKID"的组ID,我想检索站点" Penrith"one_answers" Keswick"在SQL中,我可以轻松执行以下操作:
SELECT [SiteName], [Supervisor]
FROM Sites
WHERE Id IN (
SELECT [siteId]
FROM [GroupSites]
WHERE groupId = 'iAX0GE9ZRU0AuxXMBkid'
)
...或我可以从[grouptites]上加入的站点中进行选择。我的问题是在Firebase中复制这一点。我可以使用我的GroupId标准从组派表中进行选择,但是如何处理返回的结果以查询站点表?
我在网上发现的所有示例似乎都在提到firebase的早期版本 - 或者是因为我使用的是AngularFirestRecollection库,因为我有语法或"未找到"错误实际上,我遇到的一切。
这是我的角度服务:
import { Injectable } from '@angular/core';
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
export interface GroupSite {
id?: string;
groupId: string;
siteId: string;
}
export interface Site {
id?: string;
siteName: string;
supervisor: string;
address: string;
}
@Injectable({
providedIn: 'root'
})
export class SiteService {
private sitesCollection: AngularFirestoreCollection<Site>;
private sites: Observable<Site[]>;
private groupSitesCollection: AngularFirestoreCollection<GroupSite>;
private groupSites: Observable<GroupSite[]>;
constructor(private db: AngularFirestore) {
this.sitesCollection = db.collection<Site>('Site');
this.sites = this.sitesCollection.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
});
})
);
}
getSites() {
return this.sites;
}
getSitesByGroup(groupId: string) {
this.groupSitesCollection = this.db.collection<GroupSite>('GroupSites'), ref => ref.where('groupId', '==', groupId);
this.groupSites = this.groupSitesCollection.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
});
})
);
console.log('groupSites: ', this.groupSites)
// get Sites referenced in this.groupSites
return this.sites;
}
}
我代码中的console.log((语句返回一个空对象,我知道这是因为数据尚未从firebase返回,所以我怀疑要获得[站点]它需要在snapshotchanges中((.pipe((,但我找不到任何工作示例。
单个查询不能有效地将文档涉及两个不同的集合中。对于您的模式,由于您将文档涉及两个集合中,因此您需要执行多个查询才能读取所需的所有内容。
您必须获取GroupsItesCollection查询的结果,迭代所得的文档以获取所有SiteID字段,并执行新的查询以从网站集合中获取每个SiteID文档。
firestore收集允许子收集,如果需要自动更新(例如名称和ID(,则可以使用Firestore函数在集合中复制数据(如果需要(。
您可以保存类似于查询的动态集合,只需要在与模式有关的每个事件上定义逻辑。
-
目录
- 站点[名称,ID,主管,地址,GroupID]
- 组[名称,id]
-
relcatalogs(您用于"加入"查询(
- groups/{groupId}/sites [id,name]
-
功能
- onCreate/update站点 ->在relcatalog中设置ID和名称