首页 > 解决方案 > 如何使用 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);

标签: node.jsfirebaseexpressfirebase-realtime-database

解决方案


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`);

推荐阅读