目前,我正在处理一组相当复杂的 firestore 查询。
我试图同时填充一个包含对其他文档的引用的数组,然后读取这些文档并将信息放入一个数组中。
更具体地说,对于这个例子,我在一个集合中有 4 个引用。我想获取这些引用,然后使用这些引用查询 4 个文档并用信息填充一个数组。
顺序如下:查询tags子集合中的所有文档,由以下函数处理:
getTagsOnPage(workspaceId: string, pageId: string) {
// get all of the references in the tags sub-collection, and puts them in an array
// get all id's, do not get data
return this.afs
.collection("users")
.doc(`${auth().currentUser.uid}`)
.collection<Workspace>("workspaces")
.doc(`${workspaceId}`)
.collection<Page>("pages")
.doc(`${pageId}`)
.collection("tags")
.snapshotChanges()
.pipe(
map((actions) => {
return actions.map((a) => {
const ref = a.payload.doc.get("reference");
return ref; // return an array of (id: reference) key-value pairs
});
})
);
}
这适用于执行订阅的以下代码:
this.pageService
.getTagsOnPage(this.workspaceId, this.currentPage.id)
.subscribe((data) => {
temp = data;
});
data如下,通过控制台:
(3) ["/users/ucB5cF4Pj3PWhRn10c9mvqQbS7x2/workspaces/It1…1tSnPI5GJrniY82vZL/localTags/1p5Tscwn14PyK6zRaFHX", "/users/ucB5cF4Pj3PWhRn10c9mvqQbS7x2/workspaces/It1tSnPI5GJrniY82vZL/localTags/lFKoB0jngmtnALut2QS2", "/users/ucB5cF4Pj3PWhRn10c9mvqQbS7x2/workspaces/It1tSnPI5GJrniY82vZL/localTags/r6sf2SX6v87arU2rKsD5"]
现在,执行下一组数据读取是我开始困惑的地方。
我最初的方法是尝试 for 循环(针对此数组的长度),但这将涉及迭代执行多个嵌套订阅,我认为从这个意义上讲这是不可能的。
我是 rxjs 的新手,只使用过 map 和 switchMap 运算符。在这种情况下,我想我会使用mergeMap和/或之类的东西,flatMap,但坦率地说,我不确定在这种情况下如何进行这项工作。此外,处理我需要根据我获得的 documentReferences 数组获取文档的 for 循环也会让我陷入循环。
这是我目前的实现,无处不在;我希望对我正在尝试做的事情有感觉。基本上,通过 getTagsOnPage 获取引用数组,等待 observable 结束,使用 switchMap 获取数据数组并对其进行循环;理想情况下,订阅每个 ref 并添加到 tagData
凌乱,我知道,但我认为一旦我知道正确的操作员使用它就会更有意义。
智慧大石
相关分类