javascript - 按 child 排序时使用 startAt() 进行分页

标签 javascript firebase pagination firebase-realtime-database

我试图只检索记录列表,按每条记录中的一个字段排序,我希望能够检索页面中的数据。

根据Firebase documentationreference.startAt() 方法有一个可选的第二个参数,即:

开始的子键。仅当按子项、值或优先级排序时才允许使用此参数。

首先,这是数据:

{
  "products" : {
    "-KlsqFgVWwUrA-j0VsZS" : {
      "name" : "Product 4",
      "price" : 666
    },
    "-Klst-cLSckuwAuNAJF8" : {
      "name" : "Product 1",
      "price" : 100
    },
    "-Klst7IINdt8YeMmauRz" : {
      "name" : "Product 2",
      "price" : 50
    },
    "-Klst9KfM2QWp8kXrOlR" : {
      "name" : "Product 6",
      "price" : 30
    },
    "-KlstB51ap1L2tcK8cL6" : {
      "name" : "Product 5",
      "price" : 99
    },
    "-KlstDR5cCayGH0XKtZ0" : {
      "name" : "Product 3",
      "price" : 500
    }
  }
}

这是能够检索第 1 页的代码(最低价商品 + 第二低价 + 第三低价):

(我使用的是 Firebase JS SDK 4.1.1)

'use strict';
var firebase = require('firebase');

firebase.initializeApp({
    apiKey: "your-api-key",
    authDomain: "your-firebase-domain",
    databaseURL: "https://your-db.firebaseio.com",
    projectId: "your-project",
    storageBucket: "your-bucket.appspot.com",
    messagingSenderId: "your-sender-id"
})

firebase.database().ref('products')
.orderByChild('price')
.limitToFirst(3)
.on('child_added', function (snapshot) {
    var key = snapshot.key;
    var data = snapshot.val();
    console.log(key + ': ' + JSON.stringify(data))
})

输出:

TJ:数据库tjwoon$节点test.js

-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}

第 2 页应该是价格第三低、第四低和第五低的产品,这意味着我的代码需要多一行:

firebase.database().ref('products')
.orderByChild('price')
.startAt(null, '-KlstB51ap1L2tcK8cL6')
.limitToFirst(3)
.on('child_added', function (snapshot) {
    var key = snapshot.key;
    var data = snapshot.val();
    console.log(key + ': ' + JSON.stringify(data))
})

输出:

TJ:database tjwoon$ node test.js
-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}

问题是它再次返回第 1 页。如果文档是正确的,结果应该从键 -KlstB51ap1L2tcK8cL6 的记录开始。

我已经尝试为价格字段添加 .indexOn 规则,但结果仍然相同。

如果我删除 orderByChild() 行,那么结果确实从给定的键开始,但是当然排序不正确,而且它的行为与文档相反...

我发现这些描述相同问题的其他 Stack Overflow 帖子:

然而,这些问题没有答案,回应也很少。 Github 存储库中没有与搜索词 startat 匹配的问题。

有没有人遇到同样的问题?这个问题使得无法以分页方式检索排序列表...

最佳答案

你快到了!

问题在于您如何为第二页调用 startAt:

.startAt(null, '-KlstB51ap1L2tcK8cL6')

要获得正确的结果,您需要同时传递价格和所谓的 anchor 项的键:

.startAt(99, '-KlstB51ap1L2tcK8cL6')

有了它,Firebase 将找到所有具有 price 99 的项目,然后返回从键 '-KlstB51ap1L2tcK8cL6' 开始的项目。

关于javascript - 按 child 排序时使用 startAt() 进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394303/

相关文章:

angular - 现在我有最新的 angularfire2 版本。如何降级到以前的版本?

html - 使分页保持在页面的中心

codeigniter - CodeIgniter 中的自动加载分页配置不起作用

javascript - 将对象分配给临时变量

javascript - 使用 TypeScript/ReactJS 的 useContext 的正确类型是什么?

javascript - 如何在js中迭代这个对象?

ios - 如何根据segmentedControl的选定索引更改刷新器的功能

javascript - Firebase 检索某个子项下的数据

php - DataTables 分页和搜索不起作用

javascript - 在浏览器选项卡之间传递变量