【问题标题】:Performing two firebase queries with argument from first query at once (inner join) using operators?使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?
【发布时间】:2020-03-24 09:21:57
【问题描述】:

使用此功能选择文档即时消息:

reservations: observable<any>;

/// ...
    this.reservations = this.afs.collection('reservations', ref => ref.where('uid', '==', 'someUID'))
      .snapshotChanges()
      .pipe(
        map(reservationData => {
          return reservationData.map(reservation => {
            const data = reservation.payload.doc.data();
            const id = reservation.payload.doc.id;

            console.log(data);

            return { id, ...data };
          });
        })
      );

我得到的结果:

[
    "serviceid": "TM2Y6vBk70rgKZ3zTUAw",
    "uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
    "venueid": "9G0miVLclY7QBZcHAMuq"
  },
  {
    "serviceid": "dReNKvOyV1rOussdSdNe",
    "uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
    "venueid": "2l3NhWeTC2HfB6nJmo5X"
  }
]

如何向这个 obervable 添加另一个查询?它应该像 sql 中的内部连接一样工作,我需要从服务集合中添加文档(从接收到的 serviceid)。这个函数应该返回:

[
  {
    "rOussk78eE1oMwdM8ba": [
      {
        "name": "some name",
        "price": 142
      }
    ],
    "uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
    "venueid": "9G0miVLclY7QBZcHAMuq"
  },
  {
    "dReNKvOyV1rOussdSdNe": [
      {
        "name": "some name",
        "price": 142
      }
    ],
    "uid": "MwdM8bak78eE1omf6u04KtqlE2X2",
    "venueid": "2l3NhWeTC2HfB6nJmo5X"
  }
]

我该怎么做?


Thanks in advance,
D.

【问题讨论】:

    标签: angular typescript google-cloud-firestore rxjs angularfire


    【解决方案1】:
    this.reservations = this.afs
          .collection('reservations', ref => ref.where('uid', '==', 'someUID'))
          .snapshotChanges()
          .pipe(
            map(reservationData =>
              reservationData.map(reservation => ({
                id: reservation.payload.doc.id,
                data: reservation.payload.doc.data()
              }))
            ),
            switchMap(reservationArr => from(reservationArr)), // reduce the mapped array to single observables
            switchMap(reservation =>
              this.afs
                .collection(`services`, ref => ref.where('serviceID', '==', reservation.id))
                .valueChanges()
                .pipe(
                  map(serviceData => {
                    const data = {};
                    data[reservation.id] = serviceData;
                    return { data, ...reservation };
                  })
                )
            )
          );
    

    您可以在获取数据后添加switchMap 以切换到第二个查询,然后添加pipe > map 可观察到的可使用原始reservationData(称为reservation)和您的第二个查询的serviceData

    【讨论】:

    • 感谢马特,它看起来不错! switchMap 做的工作,但我有错误:属性 'id' 不存在类型 '{ id: string;数据: {}; }[]'。
    • 我在中间添加了一个 switchMap 更新了我的答案,我没有考虑预订数组。您可以使用 switchMap => from(arr) 组合将可观察对象数组转换为单个可观察对象。我认为这应该可以解决该错误。
    猜你喜欢
    • 2020-03-09
    • 2014-12-02
    • 2016-09-19
    • 2022-01-20
    • 2015-08-09
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多