使用 DynamoDB 模板中的查询操作进行过滤分页

Pagination with Filtering using Query Operation in DynamoDB Template

我希望能够在限制被考虑之前使用查询操作过滤分页结果consideration.Is有什么建议可以在过滤结果上获得正确的分页吗?

我想使用以下逻辑实现 DynamoDB 扫描或查询:

Scanning -> Filtering(boolean true or false) -> Limiting(for pagination)

但是,我只能使用以下逻辑实现扫描或查询:

Scanning -> Limiting(for pagination) -> Filtering(boolean true or false)

注意:我已经尝试过 Global Secondary Index,但它在我的案例中不起作用,因为我有 5 个不同的属性要过滤和限制。

不幸的是,DynamoDB 无法执行此操作,一旦您对其中一个索引执行查询,它将读取满足您的分区和排序键的每个项目。

让我们检查一下您的示例 - 您有布尔值并且您有该字段的索引。假设 50% 的项目是假的,50% 是真的。按该索引搜索后,您将阅读 table 中所有项目的 50%(因此它几乎类似于 SCAN)。如果您设置限制,它将只读取该数量的项目,然后停止。您不能像在其他数据库中那样使用 limitskip/page/offset 的组合。

有一定程度的分页 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.Pagination.html 但它不允许您跳转到第 10 页,它只允许您一页一页地浏览所有页面。我也不确定它是如何定价的,也许 AWS 会在为你准备结果之前在内部检查所有项目,所以即使你在到达之前停止迭代,你也要为阅读整个 table 的 50% 付费结束。

也有索引最多可以有2个字段(分区,排序)的限制。


例子

您写道您有 5 个参数要查询。用于解决这些限制的解决方法是创建和管理具有您要查询的参数组合的额外字段。假设您有 table 个用户,并且有 gender, age, name, surname and position 个用户。比方说它庞大的数据库,所以你必须考虑你可以加载的数据量。那么如果你想使用DynamoDB,你就得想好你要做的所有查询。

您很可能想按名字和姓氏进行搜索,因此您创建了以姓氏作为分区键并以姓名作为排序键的索引(在这种情况下,您可以按姓氏或同时按姓氏和姓名进行搜索)。它适用于很多名称,但您发现某些名称组合太常见,您还需要按位置进行过滤。在这种情况下,您创建名为 name-surname 的新字段(列),每当您创建或更新项目时,您都需要在应用程序中处理此字段以确保它包含这两个字段,即 will-smith.然后你可以创建另一个索引,将 name-surname 作为分区键,position 作为排序键。现在您可以将其用于此类搜索。

但是您发现,对于某些姓名-职位组合,您会得到太多结果,您不想在应用程序级别处理它,并且您还想按年龄限制结果。然后,您可以使用 name-surname-position 作为分区键并使用 age 作为排序键来创建索引。此时你还可以发现你的旧 name-surname 字段和索引可以被删除,因为它不再有任何用途(名字和姓氏由另一个索引处理,并且为了搜索名字 - 姓氏 - 位置你可以使用这个索引)

有时候你也想按性别查询?在应用程序级别(或数据库查询中的额外过滤器)处理它可能比创建必须处理和支付的新索引更好。只有两种类型的性别(好吧,假设存在更多,但 99% 的人只会有男性或女性)所以如果有人只想检查的话,只在应用程序级别隐藏几个字段可能更便宜 male/female/transgenders...,但加载所有这些。因为对于额外的索引,您必须为每个单独的插入付费,但此过滤器只会不时使用。此外,当有人已经按名字、姓氏和职位进行搜索时,您无论如何也不会期望得到那么多结果,因此如果您得到 20 个(所有性别)或仅 10 个(仅限男性)结果不会有太大差异。


这 ^^ 只是您如何思考和使用 DynamoDB 的示例。具体如何使用取决于您的业务逻辑。

非常重要的提示:DynamoDB 是非常简单的数据库,只能进行非常简单的查询。它的功能比 Redis 多一点,但比传统数据库少很多。考虑您的业务的有效结果 model/use-cases 是也许您根本不应该使用 DynamoDB,因为它根本无法满足您的需求和查询。

一些基本的想法可以是这样的:

  • 键值持久化存储够用吗?使用 DynamoDB
  • 键值持久存储,一个项目可以有多个键,我最多可以搜索和过滤 2 个字段就够了吗?使用 DynamoDB
  • 持久存储,我想通过许多多个键和很多选项搜索单个 Table/Collection 是否足够?使用 MongoDB
  • 我是否需要搜索多个 table 或进行复杂的连接或需要交易?使用传统SQL数据库