Firebase过滤器具有分页功能

时间:2017-12-19 20:39:04

标签: javascript firebase firebase-realtime-database angularfire2

我正在使用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)我的评论有用户名,所以我想要让它变得容易(这就是为什么我有一个非规范化的表)

1 个答案:

答案 0 :(得分:1)

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

  1. 您要在
  2. 上过滤的商店ID
  3. 您要从
  4. 开始的评论的关键

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

    return this.db.list('/reviews', ref => { 
        return ref.orderByChild('storeID')
                  .startAt(storeID, lastKeyOnPreviousPage)
                  .limitToLast(11)
    });