使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?

Posted

技术标签:

【中文标题】使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?【英文标题】:Performing two firebase queries with argument from first query at once (inner join) using operators? 【发布时间】: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.

【问题讨论】:

【参考方案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) 组合将可观察对象数组转换为单个可观察对象。我认为这应该可以解决该错误。

以上是关于使用运算符一次(内部联接)使用第一个查询的参数执行两个 firebase 查询?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 - 内部联接的顺序

带有内部联接和子查询的 Microsoft Access 更新语句

使用内部联接实现联合所有查询

在使用 LINQ 的对面到内部联接查询方面需要帮助

与大表的内部联接减慢查询

使用内部联接删除