node.js - 如何使用 Node.js 在实时数据库中使用 orderByChild 和 startAfter
问题描述
我正在尝试按降序对订单进行排序并在特定键之后开始但它不起作用
nextAfter : -Mk4-n5BnVpwhum62n2g或任何 Key / _id
数据库记录:
{
'-Mk4-n5BnVpwhum62n2g': {
_id: '-Mk4-n5BnVpwhum62n2g',
createdAt: -1632171667626,
name: 'abc'
},
'-Mk40Ko9DbSeMdjIpY4': {
_id: '-Mk40Ko9DbSeMdjIpY4',
createdAt: -1632171809831,
name: 'new '
}
}
尝试查询:
query = dbRef.orderByChild('createdAt').startAfter(nextAfter).limitToFirst(limit);
解决方案
该startAfter()
方法接受两个参数 - 第一个是相关orderBy
值,第二个是最后一个条目的可选键(当多个条目具有相同的orderBy
条件值时)。因此,要正确地对引用进行分页,您需要传递上一个条目的createdAt
值及其键。
const baseQuery = dbRef
.orderByChild('createdAt')
.limitToFirst(limit);
let pageCount = 0, lastChildOnPage = undefined;
const children = [];
while (true) {
const pageQuery = pageCount === 0
? baseQuery
: baseQuery
.startAfter(lastChildOnPage.createdAt, lastChildOnPage.key);
const pageSnapshot = await pageQuery.once('value');
pageSnapshot.forEach((childSnapshot) => {
children.push({ key: childSnapshot.key, ...childSnapshot.val() });
})
const newLastChildOnPage = children[children.length-1];
if (lastChildOnPage !== newLastChildOnPage) {
lastChildOnPage = newLastChildOnPage;
pageCount++;
} else {
break; // no more data
}
}
console.log(`Grabbed ${pageCount} page(s) of data, retrieving ${children.length} children`);
推荐阅读
- ruby-on-rails - MessagesController#create 中的 ActiveModel::UnknownAttributeError
- node.js - 不断扩大节点内存有什么副作用?
- c++ - 项目之间的 SQLCHAR(或 SQL 函数)不一致
- ajax - 网页抓取初学者。AJAX POST 请求不起作用
- c# - 如何在 C# 中复制 Postman POST 请求
- vba - 检查目录是否存在而没有目录权限
- parallel-processing - 使用并行重写嵌套循环,其中第二个循环的参数取决于第一个循环的参数
- tensorflow - InvalidArgumentError:Conv2DCustomBackpropInput:out_backprop 的大小与训练 UNet 时计算的不匹配
- javascript - 未捕获的类型错误:无法读取 null 的属性“样式”
:3:40 - sql - 简化给定的 GCP BQ 查询