Amazon dynamodb 使用DynamoDB模板中的查询操作过滤分页

Amazon dynamodb 使用DynamoDB模板中的查询操作过滤分页,amazon-dynamodb,aws-appsync,dynamodb-queries,Amazon Dynamodb,Aws Appsync,Dynamodb Queries,在考虑限制之前,我希望能够使用查询操作筛选分页结果。是否有任何建议可以对筛选结果进行正确的分页 我想用以下逻辑实现DynamoDB扫描或查询: Scanning -> Filtering(boolean true or false) -> Limiting(for pagination) 但是,我只能使用以下逻辑实现扫描或查询: Scanning -> Limiting(for pagination) -> Filtering(boolean true or false

在考虑限制之前,我希望能够使用查询操作筛选分页结果。是否有任何建议可以对筛选结果进行正确的分页

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

Scanning -> Filtering(boolean true or false) -> Limiting(for pagination)
但是,我只能使用以下逻辑实现扫描或查询:

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

注意:我已经尝试了全局二级索引,但它在我的情况下不起作用,因为我有5个不同的属性要过滤和限制。

不幸的是,DynamoDB无法做到这一点,一旦您对其中一个索引进行查询,它将读取满足分区和排序键的每一项

让我们检查一下您的示例-您有布尔值,并且在该字段上有索引。假设50%的项目是假的,50%是真的。一旦你们按那个索引搜索,你们将阅读表格中50%的项目(所以它几乎就像扫描)。如果设置了限制,它将只读取该数量的项目,然后停止。不能像在其他数据库中一样使用
限制
跳过/页面/偏移
的组合

有一些分页级别,但它不允许您跳转到第10页,它只允许您逐个浏览所有页面。此外,我不确定它是如何定价的,也许AWS内部会在为您准备结果之前检查所有项目,因此您将支付阅读整个表的50%的费用,即使您在结束之前停止迭代

还有一个限制,索引最多可以有2个字段(分区、排序)


范例

您写道您有5个要查询的参数。用于解决这些限制的解决方法是创建和管理具有要查询的参数组合的额外字段。假设你有一个用户表,你有性别、年龄、姓名、姓氏和职位。比方说它有巨大的数据库,所以你必须考虑你可以加载的数据量。然后,如果您想要使用DynamoDB,您必须考虑所有您想要执行的查询

您很可能希望按名称和姓氏进行搜索,因此您创建了以姓氏作为分区键、以名称作为排序键的索引(在这种情况下,您可以按姓氏或同时按姓氏和名称进行搜索)。它可以用于许多名称,但您发现一些名称组合太常见,您还需要按位置进行筛选。在这种情况下,您将创建一个名为“
姓名/姓氏”的新字段(列),无论何时创建或更新项目,您都需要在应用程序中处理此字段,以确保它同时包含这两个字段,即“
威尔·史密斯”
。然后,您可以创建另一个索引,该索引将
名称姓氏
作为分区键,将
位置
作为排序键。现在,您可以将其用于此类搜索

然而,您发现,对于某些姓名-姓氏-职位组合,您得到的结果太多,您不希望在应用程序级别处理它,您还希望按年龄限制结果。然后,您可以使用
名称姓氏位置
作为分区键,年龄作为排序键来创建索引。此时,您还可以发现,旧的
名称-姓氏
字段和索引可以删除,因为it服务器不再有任何用途(名称和姓氏由另一个索引处理,仅为了搜索名称-姓氏位置,您可以使用此索引)

你有时也想按性别查询吗?最好在应用程序级别(或db查询中的额外过滤器)处理,而不是创建必须处理和支付的新索引。只有两种类型的性别(好吧,假设存在更多性别,但99%的人只有男性或女性),所以如果有人只想检查男性/女性/变性人,那么在应用程序级别隐藏几个字段可能更便宜,但要加载所有字段。因为对于额外的索引,您必须为每一次插入付费,但此筛选器将仅不时使用。此外,当有人已经按姓名、姓氏和职位进行搜索时,你也不会期望得到那么多结果,因此,如果你得到20个(所有性别)或10个(仅男性)结果,也不会有太大区别


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

非常重要的一点:DynamoDB是一个非常简单的数据库,只能执行非常简单的查询。它的功能比Redis多一点,但比传统数据库的功能要少得多。考虑您的业务模型/用例的有效结果是,可能您根本不应该使用DynamoDB,因为它不能满足您的需求和查询

一些基本思想可以如下所示:

  • 键值持久存储是否足够?使用发电机
  • 键值是持久存储吗?一个项目可以有多个键值,我最多可以搜索和过滤两个字段?使用发电机
  • 是持久性存储吗?在这里,我想通过多个键和很多选项搜索单个表/集合?使用MongoDB
  • 我需要搜索多个表还是进行复杂的连接或需要事务?使用传统的SQL数据库

不幸的是,DynamoDB无法做到这一点,一旦您对其中一个索引进行查询,它将读取满足分区和排序键的每一项

让我们检查一下您的示例-您有布尔值,并且在该字段上有索引。假设50%的项目是假的,50%是真的。一旦你们按那个索引搜索,你们将阅读表格中50%的项目(所以它几乎就像扫描)。如果设置了限制,它将只读取该数量的项目,然后停止。不能像在其他数据库中一样使用
限制
跳过/页面/偏移
的组合

有一定级别的分页,但不允许