【问题标题】:Firebase range queryFirebase 范围查询
【发布时间】:2019-01-26 20:15:02
【问题描述】:

我正在使用AngularFire+Firebase 并在firebase-database 有数据。

我正在尝试使用 Smart Table 对数据进行分页

我的问题是我不知道如何在不指定任何子项的情况下进行范围查询,即从记录 #25 到 35 获取记录

下面的查询给了我前 5 条记录

var queryFIrst = visitRef.startAt().limitToFirst(5);
$scope.Visits = $firebaseArray(queryFIrst);

现在我试图获取下一个 5 的记录,从 6 到 10,我在下面尝试了

var queryFIrst = visitRef.startAt().limitToFirst(5).endAt().limitToFirst(5);
$scope.Visits = $firebaseArray(queryFIrst);

但它给出的错误是startAtendAt 不能像这样与limit 一起使用

【问题讨论】:

    标签: javascript firebase-realtime-database angularfire


    【解决方案1】:

    一般来说,分页不适合 Firebase 的实时数据模型/API。您正在尝试为 SQL SKIP 运算符建模,该运算符不适用于 Firebase 数据库。

    但是,如果您想在 Firebase 中模拟分页,您应该考虑使用“锚点”。

    加载第一页后,该页上的最后一项将成为锚点。然后,当您想要加载下一页时,您创建一个从锚点开始的查询并加载 n+1 项。

    在伪代码中(它是真正的 JavaScript,我只是没有运行它):

    var page1 = visitRef.orderByKey().limitToFirst(5);
    var anchorKey;
    page1.on('child_added', function(snapshot) {
      anchorKey = snapshot.key; // this will always be the last child_added we received
    });
    

    现在,当您要加载下一页项目时,您可以创建一个从锚键开始的新查询:

    var page2 = visitRef.orderByKey().startAt(anchorKey).limitToFirst(6);
    

    这里有几点需要注意:

    • 您似乎正在使用 Firebase 1.x SDK 中的方法,例如空的 startAt()。虽然该代码可能仍然有效,但我的 sn-ps 使用 3.x SDK 的语法/习惯用法。
    • 对于第二个页面,您需要加载一个额外的项目,因为两个页面都加载了锚项目。
    • 如果您希望能够返回分页,还需要页面开头的锚键。

    【讨论】:

    • 感谢您的回答,我一直期待您的回答,我正在使用 Firebase 3.x。但是我从 SO 上的某个地方拿走了那个空的 startAt()。根据你的回答,这意味着我必须存储非常开始的锚点和最后一个锚点,以防用户点击转到最后一页或转到第一个返回以及用户是否转到下一页或上一页,也必须对其进行跟踪。所以理论上的结果是 Firebase 是一项复杂的任务
    【解决方案2】:

    那是你当时需要的吗?

    visitRef.orderByKey().startAt("25").endAt("35")
    

    我问过类似的问题Get specific range of Firebase Database children

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2017-03-13
      相关资源
      最近更新 更多