对内部联接2列表执行两个firebase查询



我正在构建一个简单的市场web应用程序,用户可以在其中发布他们的产品。我想得到每个产品的用户所有者。请告诉我如何使用Observable执行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",
}, 
},

如何使用observable实现这一点?

NoSQL数据库中没有内部联接子句。因此,如果您想根据在另一个位置读取的数据在某个位置读取一些数据,那么您必须执行两个单独的请求。你不可能一次就得到这些数据。

或者,如果不想执行两个单独的查询,则可以将用户数据直接保存在产品节点内,反之亦然。这种做法被称为反规范化,对于像实时数据库这样的NoSQL数据库来说是一种常见的做法。为了更好地理解,我建议您观看此视频。

如果你考虑在某个时间点尝试使用Cloud Firestore,那么我建议你阅读以下帖子中的答案:

  • 什么是Firebase Cloud Firestore中的非规范化

最新更新