Javascript 如何使用Cassandra手动分页导航到上一页

Javascript 如何使用Cassandra手动分页导航到上一页,javascript,node.js,cassandra,Javascript,Node.js,Cassandra,我正在使用Nodejs Cassandra驱动程序,我希望能够检索上一页和下一页。到目前为止,显示下一页的检索,该页保存上一页的pageState,并将其作为参数传递。遗憾的是,没有关于如何导航到上一页的信息 在我看来,有两种选择: 将每个pageState和页面保存为键值对,并对要导航到的页面使用pageState 将检索到的数据保存在数组中,并使用该数组导航到上一页。(我认为这不是一个好的解决方案,因为我必须将大块数据存储在内存中。) 这两种方法对我来说似乎都不是一个优雅的解决方案,但如

我正在使用Nodejs Cassandra驱动程序,我希望能够检索上一页和下一页。到目前为止,显示下一页的检索,该页保存上一页的
pageState
,并将其作为参数传递。遗憾的是,没有关于如何导航到上一页的信息

在我看来,有两种选择:

  • 将每个
    pageState
    和页面保存为键值对,并对要导航到的页面使用
    pageState

  • 将检索到的数据保存在数组中,并使用该数组导航到上一页。(我认为这不是一个好的解决方案,因为我必须将大块数据存储在内存中。)

这两种方法对我来说似乎都不是一个优雅的解决方案,但如果我必须选择的话,我会使用第一种

有没有什么方法可以通过使用

另一件事是,在文档中,手动分页是通过调用
eachRow
函数来使用的。如果我理解正确,它会在数据库中显示红色后立即显示每一行。问题是这是在我的API中实现的,我在HTTP响应中返回当前页面的数据。因此,为了做到这一点,我必须将每一行推送到一个自定义数组,然后在检索当前页面的数据时返回该数组。有没有办法在手动分页时使用
execute
,因为上面的内容似乎是多余的

谢谢


编辑:

这是我的数据模型:

CREATE TABLE store_customer_report (
    store_id uuid,
    segment_id uuid,
    report_time timestamp,
    sharder int,
    customer_email text,
    count int static,
    first_name text,
    last_name text,
    PRIMARY KEY ((store_id, segment_id, report_time, sharder), customer_email)
) WITH CLUSTERING ORDER BY (customer_email ASC)
我将数据显示在网格中,以便用户可以在其中导航。 在我写这篇文章时,我想到了一种不需要以前的功能就可以做到这一点的方法,但我认为这是一种有效的情况,如果有一个优雅的解决方案,那将是非常好的。

有一个选项是“更多”手册,这在使用分页功能之前是很常见的。您可以存储当前页面的最后一个分区/群集密钥,以作为响应发送回去(可能会根据其内容进行加密,很可能会生成分区密钥,并且只发送/接收群集密钥以避免安全问题)。然后,在执行“下一页”响应时,您只需从那里开始CQL查询。要返回页面,请更改集群键的子句并向后走。如果您提供了您的模式,那么就更容易给出示例。这就是pageState所做的一切

遗憾的是,没有关于如何导航到上一页的信息

这是正确的,当您进行查询并且有更多行时,Cassandra返回一个分页状态以获取下一组行,而不是上一组行。虽然分页状态所表示的内容是抽象的,但它通常是指向继续读取下一组数据的位置的指针,实际上没有读取前一组数据的概念(因为您只是读取它)

将每个页面状态和页面另存为键值对,并使用要导航到的页面的页面状态

这也是我推荐的策略,当然,要获得分页状态,您实际上必须进行查询

使用Nodejs-Cassandra驱动程序有没有现成的方法

不幸的是,我不知道,如果你想回到以前的页面,你需要跟踪状态

有没有一种方法可以将execute与手动分页一起使用,因为上面的内容似乎是多余的

是的,您也可以使用execute在options参数中提供
pageState
,它将被视为:

  client.execute('SELECT * FROM table', [], {pageState: pageState}, function (err, result) {
    ...
  });

颠倒查询顺序的好主意。如果手动进行分页,这非常有用,但是如果使用pagingState,可能会得到不可预测的结果,因为C*希望pagingState来自特定的查询。这可能真的管用,但我还没试过。谢谢你的回答。我已将数据模型添加到我的问题中。我仍然不太理解你的解决方案,所以请举个例子。