【问题标题】:Angular Firestore get nested collection `orderBy()` return empty arrayAngular Firestore获取嵌套集合`orderBy()`返回空数组
【发布时间】:2020-09-09 11:54:17
【问题描述】:

预期行为

从 Firestore 获取嵌套集合 orderBy('seqNo', sortOrder)

实际行为

如果我这样做,我可以轻松获取数据:

getAll(collectioName: string) {
        const response: AngularFirestoreCollection<ID> = this.db.collection(collectioName);

        return response.snapshotChanges()
            .pipe(
                map(snaps => snapsCoverter(snaps))
            )
    }

但只要我这样做:

 getCollectionPaginated(collectioName: string, sortOrder: OrderByDirection, pagesize: number, pageNumber: number) {
        const response: AngularFirestoreCollection<ID> = this.db.collection(
            collectioName,
            ref => ref
                .orderBy('seqNo', sortOrder)
                .limit(pagesize)
                .startAfter(pageNumber * pagesize)
        );

        return response.snapshotChanges()
            .pipe(
                map(snaps => snapsCoverter(snaps))
            )
    }

它返回一个[]

这是我调用的方法:

this.service.getCollectionPaginated(`courses/${id}/${nestedCollectionPath}`, "asc", 3, 0)
        .subscribe(x => console.log(x))

有关问题的信息

我确定问题出在这里:

ref => ref
.orderBy('seqNo', sortOrder)
.limit(pagesize)
.startAfter(pageNumber * pagesize)

只要我尝试将此逻辑应用于主集合,它就可以正常工作,但它不适用于嵌套集合。

你能看一下吗?

非常感谢。

【问题讨论】:

    标签: angular firebase google-cloud-firestore nested


    【解决方案1】:

    startAfter 不采用整数页码。事实上,Firestore 分页根本不使用页码。为了获得另一页结果,您必须首先执行限制查询以获取第一页,然后从第一页传递文档引用或有关最后一个文档的其他一些识别信息以获取第二页。

    我建议阅读:

    网络搜索会找到其他示例。

    您可能还想阅读formal Firestore documentation on pagination。虽然 Angular API 略有不同,但概念完全相同。

    【讨论】:

    • 嗨@Doug,首先请允许我感谢您的回答! :) 其次,请接受我的道歉,因为我应该更具体:问题不在于startAfter,而是每个查询。事实上,如果我们简单地执行const response: AngularFirestoreCollection&lt;ID&gt; = this.db.collection( collectioName, ref =&gt; ref .orderBy('seqNo', sortOrder),这仍然会返回一个[]。如果你想自己测试它,我很乐意为你做一个回购。非常感谢!
    【解决方案2】:

    我刚刚成功了!

    Longo 简而言之,问题出在我创建关系的方式上:我直接传递了一个 [{},{},{}],而不是通过一个 obj 数组循环并将嵌套路径中的每个单个 obj 存储在 db 上每次我尝试进行数据库查询(例如 orderBywhere 等)时,它都会返回 [] 的原因。

    现在它工作得很好,分页很棒!

     getCollectionPaginated(collectioName: string, sortOrder: OrderByDirection, pagesize: number, pageNumber: number) {
            const response: AngularFirestoreCollection<ID> = this.db.collection(
                collectioName,
                ref => ref
                    .orderBy('seqNo', sortOrder)
                    .limit(pagesize)
                    .startAfter(pageNumber * pagesize)
            );
    
            return response.snapshotChanges()
                .pipe(
                    map(snaps => snapsCoverter(snaps))
                )
        }
    

    非常感谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2019-10-28
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多