【问题标题】:How to navigate to previous page using Cassandra manual paging如何使用 Cassandra 手动分页导航到上一页
【发布时间】:2016-04-17 03:29:25
【问题描述】:

我正在使用 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)

我在网格中显示数据,以便用户可以浏览它。 在我写这篇文章时,我想到了一种不需要以前功能的方法,但我认为这是一个有效的案例,如果有一个优雅的解决方案,那就太好了。

【问题讨论】:

    标签: javascript node.js cassandra


    【解决方案1】:

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

    没错,当您进行查询并且有更多行时,Cassandra 会返回分页状态以获取下一组行,而不是之前的行。虽然分页状态所代表的东西被抽象掉了,但它一般是指向哪里继续读取下一组数据的指针,实际上并没有读取上一组数据的概念(因为你只是读取它)。

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

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

    有没有什么方法可以使用 Nodejs Cassandra 驱动程序开箱即用地做到这一点?

    不幸的是,我不知道,如果您想返回之前的页面,您将需要跟踪状态。

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

    是的,你也可以在 options 参数中提供pageState 并执行,它会被视为,即:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 颠倒查询顺序的好主意。如果您手动进行分页,这非常有用,但如果您使用 pagingState,您可能会得到不可预知的结果,因为 C* 期望 pagingState 来自特定查询。它实际上可能有效,但我没有尝试过。
      • 感谢您的回答。我已将数据模型添加到我的问题中。我仍然不太了解您的解决方案,因此非常感谢您提供示例。
      猜你喜欢
      • 2014-08-03
      • 1970-01-01
      • 2017-01-27
      • 2020-08-13
      • 2018-04-15
      • 1970-01-01
      • 2013-11-29
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多