如何链接Firestore收集以模拟SQL连接或在哪里



我有一个带有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和名称

最新更新