对INTER JOIN 2列表执行两个FireBase查询

roejwanj  于 2022-10-24  发布在  Angular
关注(0)|答案(1)|浏览(193)

我正在构建一个简单的市场网络应用程序,用户在那里发布他们的产品。我想要获取每个产品的用户所有者。请告诉我如何使用可观察对象执行Firebase内部联接!

productsRef: AngularFireList<any>;

  ///
 constructor(
    private db: AngularFireDatabase,
    private userService: UserService

  ) {
    this.productsRef = db.list('/products');
  }

getProductsList() {
    const product$ = this.productsRef.valueChanges();
    // 1st observable to get the products
    const productsResults$ = product$.pipe(
      switchMap(products => products)
      )
    );

    productsResults$.subscribe(
      console.log,
      console.error,
      () => console.log('completed httpResult$')
    );

   // 2nd observable  to get the user 
    const user$ = this.userService.getUserById(Id);

    productsResults$.subscribe(
      console.log,
      console.error,
      () => console.log('completed httpResult$')
    );

}

我得到了以下2个结果。
产品

[
  {
    "key": "-TM2Y6vBk70rgKZ3zTUAw",
    "name": "T-shirt",
    "size": "M",
    "user": "-NDNPe47CDTbjmwGgW_3",
  }, 
]

用户

{
    "key": "-NDNPe47CDTbjmwGgW_3",
    "username": "Alex199",
  },

我想要的最终结果

{
    "key": "-TM2Y6vBk70rgKZ3zTUAw",
    "name": "T-shirt",
    "size": "M",
    "user": {
       "key": "-NDNPe47CDTbjmwGgW_3",
        "username": "Alex199",
     }, 
},

我如何使用可观察对象来实现这一点?

2ic8powd

2ic8powd1#

NoSQL数据库中没有INTERNAL JOIN子句。因此,如果您希望根据在另一个位置读取的内容在另一个位置读取某些数据,则必须执行两个不同的请求。你不可能一下子就得到这些数据。
或者,如果您不想执行两个单独的查询,则可以将用户数据直接保存在产品节点中,反之亦然。这种做法称为反规格化,对于像Realtime数据库这样的NoSQL数据库来说,这是一种常见的做法。为了更好地理解,我建议你看看这篇video
如果你考虑在某个时候尝试使用Cloud Firestore,那么我建议你从以下帖子中阅读我的答案:

相关问题