首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火力起点已经设置好了。

火力起点已经设置好了。
EN

Stack Overflow用户
提问于 2019-12-12 17:29:53
回答 1查看 228关注 0票数 0

我在node.js数据上使用firebase管理和实时数据库,如下所示

当我想获得batch = batch-7的数据时,我正在做

代码语言:javascript
复制
let batch = "batch-7";
let ref = admin.database().ref('qr/');
ref.orderByChild("batch").equalTo(batch).on('value', (snapshot) =>
    {
        res.json(Object.assign({}, snapshot.val()));
        ref.off();
    });

一切都很好!但是现在我应该创建分页,即我应该根据页面接收10个元素上的数据。我使用以下代码:

代码语言:javascript
复制
let page = req.query.page;// num page
let batch = req.params.batch;// batch name
let ref = admin.database().ref('qr/');
ref.orderByChild("batch").startAt(+page*10).limitToFirst(10).equalTo(batch)
.on('value', (snapshot) =>
    {
        res.json(Object.assign({}, snapshot.val()));
        ref.off();
    });

但我有错误:

Query.equalTo:起点已经设置(通过对startAt或equalTo的另一个调用)

如何获得N的数据,从位置M开始,其中批处理等于我的批处理

EN

回答 1

Stack Overflow用户

发布于 2019-12-12 18:00:56

您只能调用一个startAt (和/或endAt) equalTo。两者都打电话是不可能的,也没有什么意义。

但是,当您传递一个偏移量时,您似乎对startAt的工作方式有了一个普遍的误解。Firebase查询不是基于偏移的,而是纯粹基于值的工作,通常也称为锚节点。

因此,当您希望获得第二个页面的数据,并按batch进行排序时,您需要传入锚节点的batch值;您希望返回的第一个项。这个锚节点通常是上一页的最后一项,因为您还不知道下一页的第一项。对于这个锚节点,您需要知道您在(batch) 上订购的项的值,通常也知道它的键(if/何时可能有多个节点具有相同的batch值)。

这也意味着您通常会请求一个比您需要的更多的项,即锚节点。

因此,当您请求第一个页面时,您应该跟踪最后一个节点的键/batch

代码语言:javascript
复制
var lastKey, lastValue;
ref.orderByChild("batch").equalTo(batch).limitToFirst(10).on('value', (snapshot) => {
  snapshot.forEach((child) => {
    lastKey = child.key;
    lastValue = child.child('batch').value();
  })
})

然后,当您需要第二个页面时,执行这样的查询:

代码语言:javascript
复制
ref.orderByChild("batch").start(lastValue, lastKey).endAt(lastValue+"\uf8ff").limitToFirst(11).on('value', (snapshot) => {
  snapshot.forEach((child) => {
    lastKey = child.key;
    lastValue = child.child('batch').value();
  })
})

上面还有一个窍门:我使用startAt而不是equalTo,这样我们就可以分页工作了。但是,通过使用最后一个已知的Unicode字符作为返回的最后一个batch值,它使用endAt来确保我们仍然以正确的项结束。

我还强烈建议查看一些以前的questions on pagination with the Firebase Realtime Database

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59309941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档