获取集合 startAfter documentID

Xar*_*mer 2 kotlin firebase google-cloud-firestore

有没有办法在 documentID 之后获取文档,例如

private fun fetchCollectoionnAfterDocumentID(limit :Long){

        val db = FirebaseFirestore.getInstance()
        var query:Query = db.collection("questionCollection")
            .startAfter("cDxXGLHlP56xnAp4RmE5") //
            .orderBy("questionID", Query.Direction.DESCENDING)
        .limit(limit)

        query.get().addOnSuccessListener {
            var questions = it.toObjects(QuestionBO::class.java)
            questions.size
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想在给定的Document ID之后获取排序的问题。我知道我可以使用DocumentSnapShot. 为了第二次或在应用程序恢复后获取,我必须将其保存DocumentSnapshot在首选项中。

可以在文档 ID 之后获取吗?

startAfter - > cDxXGLHlP56xnAp4RmE5

编辑 我知道我可以使用lastVisible DocumentSnapshot做到这一点。但我必须将lastVisible DocumentSnapshot保存在sharedPreference.

当应用程序首次启动时,从questionCollection中获取 10 个问题。下次必须在这些之后再提取 10 个问题lastVisible。因此,为了获取下一个 10,我必须将 DocumentSnapshot 对象保存在 sharedPreference 中。在看到我的数据库结构后建议我一个更好的方法。

还有一件事 questionID 与文档参考 ID 相同。

在此处输入图片说明

Ale*_*amo 8

您无法仅将文档 id 传递给startAfter()方法并简单地从该特定 id 开始,您应该传递一个DocumentSnapshots对象,如有关Firestore 分页的官方文档中所述:

使用批次中的最后一个文档作为下一个批次的光标开始。

first.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {
                =// Get the last visible document
                DocumentSnapshot lastVisible = documentSnapshots.getDocuments()
                        .get(documentSnapshots.size() -1);

                // Construct a new query starting at this document,
                Query next = db.collection("cities")
                        .orderBy("population")
                        .startAfter(lastVisible) //Pass the DocumentSnapshot object
                        .limit(25);

                // Use the query for pagination
            }
        });
Run Code Online (Sandbox Code Playgroud)

看,这里lastVisible是一个DocumentSnapshot代表最后一个可见对象的对象。您不能只传递文档 ID。有关更多信息,您可以从以下帖子中查看我的答案:

它是用 Java 编写的,但我相信您可以理解它并用 Kotlin 编写它。

编辑:

请考虑定义您的结果的顺序,以便您的所有数据页面都可以以可预测的方式存在。因此,您需要指定一个startAt()/startAfter()值来指示在排序中的哪个位置开始接收已订购的文档,或者使用 aDocumentSnapshot来指示要接收的下一个文档,如上所述。

另一种解决方案可能是将文档 id 放入文档本身(作为属性的值)并对其进行排序,或者您可以使用FieldPath.documentId()id 进行排序而无需添加。

你也可以检查这个这个


And*_*ndy 6

有一种方法可以让 startAfter(documentID) 起作用。

再创建一个文档“get”,然后使用结果作为 startAfter 输入。

val db = FirebaseFirestore.getInstance()

// I use javascript await / async here
val afterDoc = await db.collection("questionCollection").doc("cDxXGLHlP56xnAp4RmE5").get();

var query:Query = db.collection("questionCollection")
 .startAfter(afterDoc)
 .orderBy("questionID", Query.Direction.DESCENDING)
 .limit(limit)
Run Code Online (Sandbox Code Playgroud)