在文档ID

时间:2019-12-05 11:32:25

标签: firebase kotlin 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
        }
    }

我想在给定的文档ID 后获取已排序的问题。我知道我可以使用DocumentSnapShot来做到这一点。为了第二次获取或在应用恢复后,我必须将此DocumentSnapshot保存在首选项中。

可以获取文档ID后的信息吗?

  

startAfter-> cDxXGLHlP56xnAp4RmE5

修改 我知道我可以使用lastVisible DocumentSnapshot 来做到这一点。但是我必须将lastVisible DocumentSnapshot 保存在sharedPreference中。

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

  

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

enter image description here

2 个答案:

答案 0 :(得分:2)

您无法仅将文档ID传递给startAfter()方法,并且仅从该特定ID开始,您应该传递DocumentSnapshots对象,如官方文档中有关{{ 3}}:

  

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

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
            }
        });

请参见,此处lastVisible是一个DocumentSnapshot对象,它代表最后一个可见对象。您不能仅传递文档ID。有关更多信息,您可以从以下帖子中查看我的回答:

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

编辑:

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

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

您还可以检出How to paginate Firestore with Android?this

答案 1 :(得分:0)

一种简单的思考方式:如果您订购questionID,则至少需要知道文档questionID的值才能开始。您通常还会想知道键,以便在具有相同值的文档之间进行歧义消除。但是由于听起来questionID值在此集合中是唯一的,所以这里可能不需要。

但是仅知道密钥是不够的,因为这将要求Firestore扫描其整个索引以找到该文档。这样的索引扫描会破坏Firestore的性能保证,这就是为什么它要求您向您提供在索引中执行直接查找所需的信息的原因。