代码之家  ›  专栏  ›  技术社区  ›  markvgti

使用ID作为游标,在Firestore集合中的文档上翻页

  •  0
  • markvgti  · 技术社区  · 7 年前

    如何使用文档的ID作为游标来遍历集合服务器端(即使用Firebase Java Admin SDK)?

    按(随机)ID的顺序迭代文档是可以的(实际的顺序现在不重要),我只想迭代每个文档。希望避免浪费一个字段来将ID存储在文档本身中。

    我尝试了以下代码:

    String lastId = null;
    do {
        Query q = collectionRef.limit(100);
        if (null != lastId) {
            q = q.startAfter(lastId);
        }
        snapshots = q.get().get().getDocuments();
        if (Lists.isNotEmpty(snapshots)) {
            lastId = snapshots.get(snapshots.size() - 1).getId();
        }
    } while (Lists.isNotEmpty(snapshots));
    

    Lists.isNotEmpty(List<?>) 是一种方便的方法,它还检查空引用。

    这导致:

    java.lang.IllegalStateException: Too many cursor values specified. The specified values must match the orderBy() constraints of the query.
        at com.google.common.base.Preconditions.checkState(Preconditions.java:507)
        at com.google.cloud.firestore.Query.createCursor(Query.java:339)
        at com.google.cloud.firestore.Query.startAfter(Query.java:797)
    

    这意味着我需要一个 orderBy(idFieldName) 查询中的子句。

    是否有一个特殊的(保留的)名称(隐藏?)文档的ID属性?

    orderBy() .

    1 回复  |  直到 7 年前
        1
  •  2
  •   Max Mark B    5 年前

    Pagination in Firestore

    1. 定义结果的顺序,以便数据页是可预测的。您需要指定startAt/startAfter值,以指示在订购中从何处开始接收订购的文档。

    您可以将文档ID放入文档本身并对其进行排序,也可以使用 FieldPath.documentId() 按ID订购而不必添加ID。这使您可以实现选项1。