Node.js firebase起点已设置
我在node.js上使用firebase管理和实时数据库 数据看起来像 当我想得到batch=batch-7的数据时,我正在做Node.js firebase起点已设置,node.js,firebase,firebase-realtime-database,Node.js,Firebase,Firebase Realtime Database,我在node.js上使用firebase管理和实时数据库 数据看起来像 当我想得到batch=batch-7的数据时,我正在做 let batch=“batch-7”; 设ref=admin.database().ref('qr/'); ref.orderByChild(“批次”).equalTo(批次).on('value',(快照)=> { res.json(Object.assign({},snapshot.val()); 参考关闭(); }); 一切都很好! 但是现在我应该创建分页,也
let batch=“batch-7”;
设ref=admin.database().ref('qr/');
ref.orderByChild(“批次”).equalTo(批次).on('value',(快照)=>
{
res.json(Object.assign({},snapshot.val());
参考关闭();
});
一切都很好!
但是现在我应该创建分页,也就是说,我应该根据页面接收10个元素的数据。
我使用以下代码:
let page=req.query.page;//数字页
让batch=req.params.batch;//批次名称
设ref=admin.database().ref('qr/');
参考orderByChild(“批次”).startAt(+第10页).限制第一(10).相等(批次)
.on('值',(快照)=>
{
res.json(Object.assign({},snapshot.val());
参考关闭();
});
但我有一个错误:
Query.equalTo:已设置起点(通过另一次调用startAt或equalTo)
如何从位置M开始获取N的数据,其中批次等于我的批次您只能调用一个
startAt
(和/或endAt
)或equalTo
。两者都打电话是不可能的,也没有多大意义
不过,在传递偏移量时,您似乎对startAt
的工作原理有一个普遍的误解。Firebase查询不是基于偏移量的,而是只处理值,通常也称为锚节点
因此,当您想要获取第二页的数据,并按batch
排序时,需要为锚节点传入batch
的值;要返回的第一个项目。该锚节点通常是上一页的最后一项,因为您还不知道下一页的第一项。对于这个锚节点,您需要知道您订购的商品的值(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
,这样我们就可以进行分页了。但是它随后使用endAt
来确保我们仍然以正确的项目结束,方法是使用最后一个已知的Unicode字符作为要返回的最后一个batch
值
我还强烈建议你看看之前的一些文章