查询页面2 Firestore /分页

时间:2018-09-27 15:54:13

标签: firebase nosql google-cloud-firestore

我正在将Firestore用于正在从事的电子商务项目。

我的问题是,如果用户将页面放在页面2上,我将如何直接对其进行查询。

现在每页上有48个产品,基本上我需要49至97号文件。

如何?

我得到了整个分页https://firebase.google.com/docs/firestore/query-data/query-cursors

带有startAfter以及所有其他内容,但是,如果该人直接落在Page 2上并且我希望在当前的排序中使用49至97号文档,该怎么做。在文档上放置数字不是一种选择,如果他以侧面的第二个参数color = red&page = 2着陆,会导致什么。另外,我无法使用startAfter,因为我不知道49号之前的文档。

使用Firestore甚至有可能吗?

1 个答案:

答案 0 :(得分:0)

由于Firestore SDK无法从特定页面开始查询,因此唯一的方法是:

  1. 遍历所有页面,并从每页最后一页开始,从下一页开始。
  2. 您将获得所需的所有数据,对其进行排序,然后获取所需的文档。

解决方案编号的样本代码。 1:

//Taken from Firebase code example in the link
Query page = db.collection("cities")
    .orderBy("population")
    .limit(25);

List<DocumentSnapshot> desiredList;

//Looping through each pages, start from the first one
for (int page = 1; page <= desiredPage; page++) {
    page.get()
       .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot documentSnapshots) {
            desiredList = documentSnapshots.getDocuments();

            //This will be ignored if already the last page
            DocumentSnapshot lastPage = desiredList
                  .get(documentSnapshots.size() -1);
            page = db.collection("cities")
                     .orderBy("population")
                     .startAfter(lastPage)
                     .limit(25);
        }
     });
} 

解决方案编号的样品2:

//Taken from Firebase code example in the link
Query allPages = db.collection("cities")
    .orderBy("population")
    .limit(25 * desiredPage);

//Looping through each pages, start from the first one
allPages.get()
     .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot documentSnapshots) {
            //Retrieve only documents from no. something to something
            List<DocumentSnapshot> desiredDocuments = documentSnapshots
                 .getDocuments().subList(25 * (desiredPage - 1), desiredPage * 25);
        }
     });

(也许会有诸如startAtPage()之类的功能) 虽然我更喜欢没有解决方案。 2为简单起见,但每个开发人员都有自己的偏好。