【发布时间】:2020-10-18 11:05:42
【问题描述】:
我有两个收藏
集合 1- 模块,
collection 2-profile >> modules(作为profile集合中的子集合)
我想将集合 1 中的所有文档复制到集合 2 中(一次操作)
以下是我尝试过的
private afs:AngularFirestore;
this.afs.collection('modules').valueChanges().subscribe(vals =>{
vals.forEach(moduleFromRepo =>{
this.afs.collection('profiles').doc('userid1').collection('modules').add(moduleFromRepo);
})
});
此代码的问题 - 虽然这是第一次工作,然后每次将新文档添加到集合 1 时,整个集合 1 都会重新复制到集合 2,这样我就会得到几个重复的文档副本在集合 2 中。
另外,我的方法首先是正确的吗?实现这一目标的正确编码方法是什么?
【问题讨论】:
-
您是要一次复制所有内容,还是要复制对文档的更改,因为它们会随着时间的推移而发生?请编辑问题以明确您的目标是什么。您的代码正在使用实时侦听器,并且每次更改都会传递整个文档集。
-
我宁愿使用
onUpdate事件触发函数,如下所述:firebase.google.com/docs/functions/firestore-events。主要思想是检查来自 collection1 的即将到来的数据,如functions.firestore.document('modules/{moduleId}')然后使用用户 ID(如果更新的模块文档有此数据)通过 id 获取 collection2 文档并保存到其子集合中 -
那你为什么不写一个触发器函数,正如你在那个文档中看到的那样,而不是在客户端应用程序中这样做?
-
它是一次性操作(也在问题中编辑)。因此,我认为我不需要创建触发器。我还找到了一种解决方法,使用 take(1) ( rxjs 运算符)-我实现了我想要的。
-
随意回答你自己的问题并接受它是正确的,这样其他人也可以有一个明确的解决方案。
标签: javascript angular google-cloud-firestore rxjs angularfire