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

当我想获得batch = batch-7的数据时,我正在做
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个元素上的数据。我使用以下代码:
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开始,其中批处理等于我的批处理
发布于 2019-12-12 18:00:56
您只能调用一个startAt (和/或endAt) 或 equalTo。两者都打电话是不可能的,也没有什么意义。
但是,当您传递一个偏移量时,您似乎对startAt的工作方式有了一个普遍的误解。Firebase查询不是基于偏移的,而是纯粹基于值的工作,通常也称为锚节点。
因此,当您希望获得第二个页面的数据,并按batch进行排序时,您需要传入锚节点的batch值;您希望返回的第一个项。这个锚节点通常是上一页的最后一项,因为您还不知道下一页的第一项。对于这个锚节点,您需要知道您在(batch) 和上订购的项的值,通常也知道它的键(if/何时可能有多个节点具有相同的batch值)。
这也意味着您通常会请求一个比您需要的更多的项,即锚节点。
因此,当您请求第一个页面时,您应该跟踪最后一个节点的键/batch:
var lastKey, lastValue;
ref.orderByChild("batch").equalTo(batch).limitToFirst(10).on('value', (snapshot) => {
snapshot.forEach((child) => {
lastKey = child.key;
lastValue = child.child('batch').value();
})
})然后,当您需要第二个页面时,执行这样的查询:
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。
https://stackoverflow.com/questions/59309941
复制相似问题