问题标签 [amazon-dynamodb-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
141 浏览

amazon-web-services - DynamoDB 表设计模式:带有 utc 时间戳的分类数据

我目前正在设计一个 DynamoDB 模式,我不知道我是否走在正确的轨道上。

我需要将以下数据存储到 DynamoDB 表中:

  • 设备ID(编号)
  • deviceLogType(字符串)
  • timestamp (number) // 时间戳的单位是 utc 秒
  • 其他杂项属性

此 DynamoDB 表的主要查询是通过 deviceID 和 deviceLogType 在一个时间范围内查询数据。是

分区键deviceLogType_deviceID

排序键timestamp

我的问题是:

  • 上面的设计正确吗?
  • 使用复合键作为分区键来表示层次关系是否属于最佳实践?
0 投票
1 回答
543 浏览

amazon-dynamodb - 在 DynamoDB 中,哪个更快?按 Id 查询还是按二级索引属性查询?

我有一个 DynamoDB 表,我需要在其中查询两个不同的属性,有时是一个,有时是另一个,但从不同时查询。

假设我有一个属性 A 和属性 B,其他属性在这里无关紧要。

我正在考虑设计这个表,其中哈希键是属性 A,GSI 是属性 B。这样我总是执行query而不是scan.

现在我想到一个问题,在属性 A(即 Id)或属性 B (GSI) 上哪个查询更快?

如果有一些差异,我可以切换,让 B 作为 Id,让 A 作为 GSI。

谢谢

0 投票
0 回答
461 浏览

amazon-dynamodb - 使用地理空间数据(本地二级索引)和外键保存为范围键的 DynamoDb 查询

我正在尝试构建一个支持这 3 种访问模式的 DynamoDb 表:

  1. 访问给定邮政编码 XX 半径内的机构列表。
  2. 给定教育级别(4 年、2 年、高中等)的给定邮政编码的 XX 半径内的机构访问列表。
  3. 给定工作代码和教育水平的给定邮政编码的 XX 半径内的机构访问列表。

分区键是作为 DynamoDb 的地理库(AWS 地理库)的一部分生成的。所以基本上,我通过地理位置将机构分组在一起,支持在提供的邮政编码的 XX 半径内搜索机构的能力(使用邮政编码的纬度/经度)。

下面是我的 DynamoDb 表的 CloudFormation 模板:

这是我表中的数据示例:

在此处输入图像描述

  • 176008代表一个机构。
  • 2代表教育水平(4 年制)。
  • 11-1011.00代表工作代码

Hashkey 值 966762 是 GeoHash 值的前 6 位。这使我可以按距离将机构分组。这使我可以搜索半径范围内的机构。我有一个使用 Hashkey 和 GeoHash 的本地二级索引 (LSI)。我的查询是使用 LSI 查找半径内的机构。

我还希望能够通过这些访问模式进一步过滤半径内的机构:

  • 教育水平。示例:2_*
  • 工作代码和教育程度。示例:11-1011.00_2_*

我遇到了一堵墙,DynamoDb 只允许基于 2 个关键条件进行查询。为了进行地理查询(在半径内),我必须使用哈希键和 LSI(使用 geohash)。我被阻止使用我的范围键进行进一步过滤,该范围键是对机构与教育水平和工作代码的关系进行建模。

如何使用 DynamoDb 按半径过滤并使用教育水平和/或工作代码等相关数据进行过滤?

0 投票
0 回答
66 浏览

amazon-dynamodb - DynamoDB 表大小

我正在开发一个 DynamoDB 表,其中包含按邮政编码的工资数据。这是我的表的结构:

在此处输入图像描述

对于给定的邮政编码,将有一个名为 Meta 的排序键,其中包含纬度/经度、城市、州、县等。除了 Meta,我将在排序键中为给定邮政编码的不同工资数据源提供值代码。工资数据的每个值都是一个 JSON 文档。我会有很多不同的数据源。例如,大约有 41K 邮政编码和大约 1100 个 ONET 编码,相当于大约 4600 万行,给予或接受 - 仅适用于 ONET 数据源类型。

  1. DynamoDB 表可以有效处理多少行?
  2. 有没有更好的方法来构建这些数据?

感谢您的时间。

0 投票
1 回答
555 浏览

amazon-web-services - AWS DynamoDB 向后扫描忽略 LastEvaluatedKey

我正在使用 AWS 托管 API 与 API Gateway 和 DynamoDB 直接集成。

我现在正在尝试为我的应用程序添加分页功能,但我很难 100% 地实现它。我面临的问题是当我向后扫描时,我会给你一个例子来更好地理解这个问题。

想象一下,我有一个包含 20 个项目和一个页面大小为 5 的列表。

  1. 当我查询我的表时,第一个查询将返回1, 2, 3, 4, 5. 预期行为!
  2. 当我查询我的表时,将第五个元素中的 lastEvaluatedKey 传递给它,它返回6, 7, 8, 9, 10. 预期的行为。
  3. 现在,当我使用 flag 进行查询时,我的问题就出现了ScanIndexForward=false。这意味着我不想继续前进。相反,我想要lastEvaluatedKey. 问题是,如果我使用lastEvaluatedKey从上次查询中检索到的内容,而不是类似5, 4, 3, 2, 1,我有4, 3, 2, 1.

如果需要,将跳过来自lastEvaluatedKey或调用它的元素。head

如果您想象在一个表格中的正常行为,您单击next pageprevious page,这意味着当您转到第二页并返回第一页时,您将只得到 4 个项目,而不是一个,因为提议的情景。

最后,我尝试了相同的查询,AWS CLI结果是一样的。在与支持人员聊天后,他们确认这是预期的行为。

我只是想知道人们如何看待这种情况,因为我知道亚马逊在生产中使用它,所以应该有办法做到这一点。

0 投票
0 回答
260 浏览

java - Dynamodb - 查询多个范围值的全局二级索引

我在一张表上有一个带有哈希和范围键的全局二级索引。我想获取具有特定哈希键和某个可能范围值列表的单个查询条目。

我试过这个,但得到一个例外:

得到这个例外:

线程“主”com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException 中的异常:尝试的条件约束不是可索引操作(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ValidationException;请求 ID:4c7d2a81-ad80-4f06- b565-939716adfc20)

还尝试了ComparisonOperator.EQ,但得到:线程“main”com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException中的异常:一个或多个参数值无效:EQ ComparisonOperator的参数数量无效

0 投票
3 回答
6678 浏览

amazon-dynamodb - com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException:无法从回填全局二级索引中读取

我们在我们的应用程序中不断收到此异常,该应用程序有一个计划作业来读取全局二级索引。看起来它会定期回填,即使桌子上没有任何变化。我们桌子上的交易量非常低,所以每天看到几次有点惊讶。这不是一个新索引,所以想知道它不应该只在插入/更新记录时回填。有人见过这个吗?

0 投票
0 回答
72 浏览

amazon-web-services - 确保 dynamodb 中的单个活动项目

我有下表:

  • 属性 1
  • 属性 2
  • 属性 3
  • 属性 4 -> 重复数据删除密钥
  • 属性 5 -> 状态
  • UUID。

以及在此之上为 CRUD 构建的服务。

项目的初始状态是“活动”。如果调用了 CRUD API createItem,我需要检查是否已经存在具有相同de-dupe key'active'状态的项目,如果是,我需要修改此项目,否则为具有“活动”状态的相同重复数据删除密钥创建一个新项目。

我不能在重复数据删除密钥上使用 GSI 并确保单例性质。当应用程序写入或删除表中的项目时,该表上的任何全局二级索引都会使用最终一致的模型异步更新。

但是,还有其他方法可以实现这一点:

  1. 有一个不同的表以将重复数据删除键(作为主键)和活动项目 UUID 作为唯一属性。因此,DAO 与两个表进行交互以进行交互。这很痛苦,因为 DAO 必须处理 2 个表(处理原子性可能很困难)。

  2. 将重复数据删除作为 PK,将时间戳作为排序键。除活动项目外,保持时间戳为 0。并对其执行条件更新,直到其状态发生变化。但是,使用这种方法,我将失去在 UUID 上执行 batchLoad/batchGet 的能力,因为重复数据删除密钥是 PK。

任何想法,将不胜感激。谢谢。

0 投票
1 回答
212 浏览

amazon-dynamodb - 使用 OR 和 beginWith 的 DynamoDB 查询

首先,我知道我们不能在KeyConditionExpression. 我将 I18n 密钥存储在数据库中,并且具有以下数据结构:

我还有一个 UI,其中有一个文本字段,应该允许我按任何语言文本过滤键。在这种情况下,英语或德语,由键de和表示en

我想实现一个关键条件表达式如下所示的查询:

如前所述,这将是理想的,但由于我们没有OR操作,我真的不知道如何修改查询或如何创建允许我进行此查询的 GSI。

谢谢

0 投票
1 回答
43 浏览

amazon-dynamodb - Dynamodb 查询/扫描嵌套文档。指定 GSI

我有以下 DynamoDb 文档的结构

我目前正在使用 Dynamodb Mapper 来保存文档。

我有以下问题

  1. 每次我更新表时,它都会在 DynamoDb 表中创建一条新记录?这是预期的吗?在查询时,我必须每次将 Limit 设置为 1 才能获取最新记录。是因为我有 SortKey 作为当前时间戳吗?如果我删除 sortKey 会有帮助吗?

  2. 我想执行以下查询:获取所有具有 SubjectMarks > 60 的 StudentNames 这应该返回学生 Ben,但只有 Subject Math。这可能吗?我需要使用查询还是扫描?使用 GSI 会有帮助吗?在这种情况下,我如何使用点运算符,因为主题是一个列表?