Firebase过滤器具有分页功能

问题描述 投票:1回答:1

我正在使用Firebase + Angular进行开源Yelp。

我的数据库:

    {
      "reviews" : {
        "-L0f3Bdjk9aVFtVZYteC" : {
          "comment" : "my comment",
          "ownerID" : "Kug2pR1z3LMcZbusqfyNPCqlyHI2",
          "ownerName" : "MyName",
          "rating" : 2,
          "storeID" : "-L0e8Ua03XFG9k0zPmz-"
        },
        "-L0f7eUGqenqAPC1liYj" : {
          "comment" : "me second comment",
          "ownerID" : "Kug2pR1z3LMcZbusqfyNPCqlyHI2",
          "ownerName" : "MyName",
          "rating" : 3,
          "storeID" : "-L0e8Ua03XFG9k0zPmz-"
        },    
      },
      "stores" : {
        "-L0e8Ua03XFG9k0zPmz-" : {      
          "description" : "My good Store",      
          "name" : "GoodStore",
          "ownerID" : "39UApyo0HIXmKPrTOi8D0nWLi6n2",      
          "tags" : [ "good", "health", "cheap" ],
        }
      },
      "users" : {
        "39UApyo0HIXmKPrTOi8D0nWLi6n2" : {
          "name" : "First User"
        },
        "Kug2pR1z3LMcZbusqfyNPCqlyHI2" : {
          "name" : "MyName",
          "reviews" : {
            "-L0f3Bdjk9aVFtVZYteC" : true,
            "-L0f7eUGqenqAPC1liYj" : true
          }
        }
      }
    }

我使用下面的代码获取所有商店的评论(使用AngularFire2)

    getReviews(storeID: string){
        return this.db.list('/reviews', ref => { 
            return ref.orderByChild('storeID').equalTo(storeID);
        });
    }

现在,我想做一个服务器端审查分页,但我想我不能用这个数据库结构来做。我对吗?尝试:

    getReviews(storeID: string){
        return this.db.list('/reviews', ref => { 
            return ref.orderByChild('storeID').equalTo(storeID).limitToLast(10) //How to make pagination without retrive all data?
        });
    }

我认为我可以将所有评论都存放在商店内,但是(i)我不想在有人要求商店时立即检索所有评论而且(ii)我的评论有用户名,所以我想让它变得容易改变它(这就是为什么我有一个非规范化的表)

javascript firebase firebase-realtime-database angularfire2
1个回答
1
投票

对于第二页,您需要了解两件事:

  1. 要筛选的商店标识
  2. 您想要开始的评论的关键

您已经拥有商店ID,因此很容易。作为开始的关键,使用上一页上最​​后一项的键,然后只需要一个额外的项目。最后,你需要使用start()(可能还需要使用endAt()

return this.db.list('/reviews', ref => { 
    return ref.orderByChild('storeID')
              .startAt(storeID, lastKeyOnPreviousPage)
              .limitToLast(11)
});
© www.soinside.com 2019 - 2024. All rights reserved.