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

时间:2016-01-12 13:26:54

标签: javascript node.js cassandra

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

我认为有两种选择:

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

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

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

有没有办法使用Nodejs Cassandra driver开箱即用?

另一件事是,在文档中,通过调用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)

我在网格中显示数据,以便用户可以通过它进行导航。 在我写这篇文章时,我想到了一种方法,无需先前的功能就可以做到这一点,但我认为这是一个有效的案例,如果有一个优雅的解决方案,它会很棒。

2 个答案:

答案 0 :(得分:4)

  

可悲的是,没有关于如何导航到上一页的信息。

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

  

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

这也是我推荐的策略,当然也是为了获得你实际需要进行查询的分页状态。

  

有没有办法使用Nodejs Cassandra驱动程序开箱即用?

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

  

有没有办法使用手动分页执行,因为上面似乎是多余的?

是的,您可以在options参数中提供pageState,也可以将其视为,例如:

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

答案 1 :(得分:3)

可以选择"更多"手动,这在分页功能之前很常见。您可以存储作为响应发送回的当前页面的最后一个分区/群集密钥(可能根据内容加密,最有可能生成分区密钥,仅发送/接收群集密钥以避免安全问题)。然后在做你的"下一页"响应你只需要从那里开始你的CQL查询。要返回页面,请更改群集密钥的ORDER BY子句并向后移动。如果您提供架构,则可以更轻松地提供示例。无论如何,所有的pageState确实都有。