Angular 将2个firebase集合合并到一个阵列中

Angular 将2个firebase集合合并到一个阵列中,angular,firebase,collections,Angular,Firebase,Collections,我想结合2个firebase系列,但我不知道如何做到这一点。 简而言之,我有一个包含所有评论和回复的评论集合,我需要通过电子邮件搜索添加来自另一个集合的每个用户的图像 我有以下型号: 导出类UserAdditionalInfo{ 建造师( 公共名称:string, 公共电话号码:, 公共电话号码:, 公共电子邮件:string, public userImg:string, 公共id:string ){} } //... 从“./comment reply.model”导入{CommentRe

我想结合2个firebase系列,但我不知道如何做到这一点。 简而言之,我有一个包含所有评论和回复的评论集合,我需要通过电子邮件搜索添加来自另一个集合的每个用户的图像

我有以下型号:

<代码>导出类UserAdditionalInfo{ 建造师( 公共名称:string, 公共电话号码:, 公共电话号码:, 公共电子邮件:string, public userImg:string, 公共id:string ){} } //... 从“./comment reply.model”导入{CommentReply}; 导出类注释{ 建造师( 公共名称:string, 公共电子邮件:string, 公开日期:firebase.firestore.Timestamp, 公众评论:string, 公共id:string, 公众回复?:CommentReply[] ){} } //... 导出类评论回复{ 建造师( 公共名称:string, 公共电子邮件:string, 公开日期:firebase.firestore.Timestamp, 公众评论:string, 公共id:string, 公共commentId:string ){}
}Firestore是一个限制性很强的数据库,您不能在各种集合中执行
内部联接
,这是因为Firesbase是一个NOSQL数据库,主要关注性能和安全性。因此,我建议在使用已注册并存储在与当前用户相关的web应用程序中的
UserAdditionalInfo
创建评论或评论回复时插入图像url。在更新/擦除的情况下,我建议使用与
UserAdditionalInfo
相关的更新/擦除触发器

简而言之,沿着集合复制所需的数据,在本例中为
userImg
,并创建触发器以保持集合的一致性

看到你的评论,我给你写了一些代码:

在您的Web应用程序中

我开始编写一个服务来存储
UserAdditionalInfo


导出类用户服务{
private useraddationalinfo:useraddationalinfo;
...
登录(用户名:string,密码:string){
...
const userId=getUserId();
if(userisPropertyLogin){
//从firestore获取用户附加信息
userAdditionaInfo=getFromFirestoreUserAdditionalInfo(用户ID);
}
}
getImageUrl():字符串{
返回userAdditionInfo.userImg;
}
}
因此,当你写评论或评论回复时:

/。。。
导出类评论回复{
建造师(
公共名称:string,
公共电子邮件:string,
公开日期:firebase.firestore.Timestamp,
公众评论:string,
公共id:string,
public commentId:string,
//附加信息
userImageUrl:string
){}
}
//...
导出类注释{
建造师(
公共名称:string,
公共电子邮件:string,
公开日期:firebase.firestore.Timestamp,
公众评论:string,
公共id:string,
公众回复?:CommentReply[],
//附加信息
userImageUrl:string
){}
}
//...
导出类评论服务{
构造函数(私有用户服务:用户服务){}
...
私有createComment(包含:字符串):Comment{
...
comment.userImageUrl=userService.getImageUrl();
回复评论;
}
注释(包含:字符串){
...
注释:comment=createComment(包含);
addCommentToFirestore(注释);
}
私有createReply(包含:字符串):CommentReply{
...
commentReply.userImageUrl=userService.getImageUrl();
}
回复(包含:字符串){
回复:reply=createReply(包含);
addReplyToFirestore(回复);
}
}
关于
CommentReply
,我认为将此数据移动到数组而不是数组中,允许与此回复相关的查询是一个好主意

在云功能中:

我建议创建一个函数,在
UserAdditionalInfo
更改或删除时触发。此外,本说明还提供了创建项目功能的分步指南

关于更新
UserAdditionInfo
(在云功能中使用Nodejs 10配置):

export const updateUserAdditionalInfoTrigger=functions.region('WRITE-HERE-YOUR-region').firestore
.document(`UserAdditionInfo/{userAdditionalId}`)
.onUpdate((更改,上下文:functions.EventContext)=>{
//检查电子邮件/图像URL或任何相关数据是否已更改
//创建firestore事务
//获取与此用户相关的所有评论
//更新所有评论
//获取与此用户相关的所有答复
//更新所有答复
//结束交易
}

我也考虑过这个选项-从UserAdditionalInfo保存userImg。这是一个更简单的选项,因为我甚至在用户登录后将其保存在本地存储中。但问题是,当用户更改其图像时,注释中的图像将保持原来的图像。如果之后我这样做,我必须更新com中的许多链接我想这不是一个好的选择。我尝试过像这篇文章中的第二个例子:使用“rxjs”中的CombineTest,但没有成功。谢谢你的例子,我认为这是一个很好的解决方案。我以后会用这种方式尝试我将添加一条评论。你能把这个答案标记为一个好的答案吗?如果你认为这是一个好的解决方案……我将关注你可能遇到的任何进一步的问题。告诉我我是否错了或我遗漏了什么,但这样我将获取userImg url,并将它保存在评论集合中,就像url一样,但如果用户更改了他的ima,我会这样做ge,在注释集合中,旧链接将保留。这就是希望动态添加另一个集合中的图像的原因,因为我已订阅UserAdditional