如何在Firebase中查询和汇总多个集合

时间:2019-10-07 11:23:36

标签: javascript angular firebase google-cloud-firestore angularfire2

我需要按项目和用户列表检索每月的工作订单集合(在该月份中,我可能有一些项目的OdL小时未包含在用户列表中,而用户可能有一些其他项目的OdL)。 OdL模型包含项目(projectCode)和用户(userId)的字符串。 我将时间戳格式的日期,项目代码和带有用户列表的数组发送给服务。

this.loadGantt(from: Timestamp, to: Timestamp, projectCode: string, users: string[]){...}

我尝试执行单个查询,一个查询用于项目代码,一个查询用于单个用户。 这些是服务的查询:

this.docs = this.afs.collection<OdlModel>('odl', ref => {
      return ref.where('projectCode', '==', project)
        .where('date', '>=', from)
        .where('date', '<=', to)
        .orderBy('date', 'asc');
    })
      .snapshotChanges().pipe(map(coll => {
        return coll.map(doc => ({ id: doc.payload.doc.id, ...doc.payload.doc.data()}));
      }));
    return this.docs;

this.docs = this.afs.collection<OdlModel>('odl', ref => {
      return ref.where('userId', '==', user)
        .where('date', '>=', from)
        .where('date', '<=', to)
        .orderBy('date', 'asc');
    })
      .snapshotChanges().pipe(map(coll => {
        return coll.map(doc => ({ id: doc.payload.doc.id, ...doc.payload.doc.data()}));
      }));
    return this.docs;

这是我找到的解决方案:

loadGantt() {
    const momentDate: Moment = moment(new Date());
    this.firstDay = momentDate.startOf('month').toDate();
    this.lastDay = momentDate.endOf('month').toDate();
    const from = firebase.firestore.Timestamp.fromDate(this.firstDay);
    const to = firebase.firestore.Timestamp.fromDate(this.lastDay);
    this.odl = [];
    const odlArray = [];
    const a$ = this.odlService.getProjectOdlCollection(from, to, 'IGNC0954-IMI-19');
    odlArray.push(a$);
    this.user.forEach(u => {
      const b$ =  this.odlService.getUserOdlCollection(from, to, u);
      odlArray.push(b$);
    });
    const result$ = combineLatest([odlArray]);

    result$.subscribe(res => {
      res.map(r => {
         r.subscribe(odl => {
           odl.forEach(o => {
             const index = this.odl.findIndex(x => x.id === o.id);
             if (index === -1) {
               this.odl.push(o);
             }
           });
         });
      });
    });
  }

如何在单个Observable对象中获取所有数据?

1 个答案:

答案 0 :(得分:0)

下面的代码片段显示了如何将AngularFire中的两个或多个Firestore集合组合到单个Observable对象中。

Link here

数据结构

const usersRef = this.afs.collection('users');

const fooPosts = usersRef.doc('userFoo').collection('posts').valueChanges();
const barPosts = usersRef.doc('userBar').collection('posts').valueChanges();

解决方案

import { combineLatest } from 'rxjs/observable/combineLatest';


const combinedList = combineLatest<any[]>(fooPosts, barPosts).pipe(
      map(arr => arr.reduce((acc, cur) => acc.concat(cur) ) ),
      )

this example也可能会帮助您解决问题。

让我知道这是否有帮助。