通过REST API在属性上分页Firebase数据,无需重复

时间:2016-11-01 18:41:34

标签: rest firebase pagination firebase-realtime-database

REST API中是否有等效的startAt(value, [key])?特别是可选的密钥参数。

https://www.firebase.com/docs/web/api/query/startat.html

详细说明:

我使用REST API在属性(dueDate)上分页。通过工作进行分页,但由于dueDate的值不是唯一的,因此每个连续的页面可能包含多个重复项。在最糟糕的情况下,日期可能会比页面大小更多重复,这会打破分页。

由于Firebase分页工作的方式,我预计会有1个重复,这是上一页的最后一项。

JS SDK startAt方法支持第二个参数,用于在进行下一个查询时提供最后一个键,但这似乎不存在,或者未在REST API中记录。

无用,REST API文档不提供查询参数的完整规范,只提供REST特定的参数,如“auth”和“shallow”。

  

ORDERBY

     

有关详细信息,请参阅指南中有关有序数据的部分。

     

limitToFirst,limitToLast,startAt,endAt,equalTo

     

有关详细信息,请参阅“查询数据指南”中的部分。

文档:https://firebase.google.com/docs/reference/rest/database/#section-query-parameters

NodeJS中的请求:

var request = require('request-promise');
var startAt = 0
var now = new Date().getTime(); // calculate once per paginated query
getPage(startAt, now)
// then process page
// then get the next page
// etc

function getPage(startAt, endAt, lastId) {
  var params = {
    auth: /* ... auth token ... */,
    orderBy: '"dueDate"',
    startAt: startDate, /* startDate is a Unix timestamp in milliseconds */
    endAt: endAt,
    limitToFirst: 1000
  };
  return request.get({
    url: 'https://my-firebase.firebaseio.com/todos.json',
    qs: params,
    json: true,
    timeout: 20000 /* ms */
  });
}

我看过Firebase REST API: How to fetch data by priority like startAt/endAt in JS?。较新的答案是指旧的文档,如上所述,除非我遗漏了某些内容,否则不回答这个问题。我已经阅读了旧文档和新文档页面中REST部分的所有内容。

1 个答案:

答案 0 :(得分:1)

在与Firebase支持相对应后,他们已确认REST API目前不支持带关键参数的startAt。

由于我们在这种情况下的数据是用户选择的日期(因此可能存在重复),我们提出了一种解决方法,使用日期来计算该日期时间的firebase推送ID,我们可以将其添加为额外的索引属性和分页,以确保每页不会超过1个重复。

下面的要点包含推送ID算法,其中包含许多其他语言的端口,如果有其他人需要这样做的话。

https://gist.github.com/mikelehen/3596a30bd69384624c11