问题标签 [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.
amazon-web-services - DynamoDB 表设计模式:带有 utc 时间戳的分类数据
我目前正在设计一个 DynamoDB 模式,我不知道我是否走在正确的轨道上。
我需要将以下数据存储到 DynamoDB 表中:
- 设备ID(编号)
- deviceLogType(字符串)
- timestamp (number) // 时间戳的单位是 utc 秒
- 其他杂项属性
此 DynamoDB 表的主要查询是通过 deviceID 和 deviceLogType 在一个时间范围内查询数据。是
分区键:deviceLogType_deviceID
排序键:timestamp
我的问题是:
- 上面的设计正确吗?
- 使用复合键作为分区键来表示层次关系是否属于最佳实践?
amazon-dynamodb - 在 DynamoDB 中,哪个更快?按 Id 查询还是按二级索引属性查询?
我有一个 DynamoDB 表,我需要在其中查询两个不同的属性,有时是一个,有时是另一个,但从不同时查询。
假设我有一个属性 A 和属性 B,其他属性在这里无关紧要。
我正在考虑设计这个表,其中哈希键是属性 A,GSI 是属性 B。这样我总是执行query
而不是scan
.
现在我想到一个问题,在属性 A(即 Id)或属性 B (GSI) 上哪个查询更快?
如果有一些差异,我可以切换,让 B 作为 Id,让 A 作为 GSI。
谢谢
amazon-dynamodb - 使用地理空间数据(本地二级索引)和外键保存为范围键的 DynamoDb 查询
我正在尝试构建一个支持这 3 种访问模式的 DynamoDb 表:
- 访问给定邮政编码 XX 半径内的机构列表。
- 给定教育级别(4 年、2 年、高中等)的给定邮政编码的 XX 半径内的机构访问列表。
- 给定工作代码和教育水平的给定邮政编码的 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 按半径过滤并使用教育水平和/或工作代码等相关数据进行过滤?
amazon-web-services - AWS DynamoDB 向后扫描忽略 LastEvaluatedKey
我正在使用 AWS 托管 API 与 API Gateway 和 DynamoDB 直接集成。
我现在正在尝试为我的应用程序添加分页功能,但我很难 100% 地实现它。我面临的问题是当我向后扫描时,我会给你一个例子来更好地理解这个问题。
想象一下,我有一个包含 20 个项目和一个页面大小为 5 的列表。
- 当我查询我的表时,第一个查询将返回
1, 2, 3, 4, 5
. 预期行为! - 当我查询我的表时,将第五个元素中的 lastEvaluatedKey 传递给它,它返回
6, 7, 8, 9, 10
. 预期的行为。 - 现在,当我使用 flag 进行查询时,我的问题就出现了
ScanIndexForward=false
。这意味着我不想继续前进。相反,我想要lastEvaluatedKey
. 问题是,如果我使用lastEvaluatedKey
从上次查询中检索到的内容,而不是类似5, 4, 3, 2, 1
,我有4, 3, 2, 1
.
如果需要,将跳过来自lastEvaluatedKey
或调用它的元素。head
如果您想象在一个表格中的正常行为,您单击next page
和previous page
,这意味着当您转到第二页并返回第一页时,您将只得到 4 个项目,而不是一个,因为提议的情景。
最后,我尝试了相同的查询,AWS CLI
结果是一样的。在与支持人员聊天后,他们确认这是预期的行为。
我只是想知道人们如何看待这种情况,因为我知道亚马逊在生产中使用它,所以应该有办法做到这一点。
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的参数数量无效
amazon-dynamodb - com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException:无法从回填全局二级索引中读取
我们在我们的应用程序中不断收到此异常,该应用程序有一个计划作业来读取全局二级索引。看起来它会定期回填,即使桌子上没有任何变化。我们桌子上的交易量非常低,所以每天看到几次有点惊讶。这不是一个新索引,所以想知道它不应该只在插入/更新记录时回填。有人见过这个吗?
amazon-web-services - 确保 dynamodb 中的单个活动项目
我有下表:
- 属性 1
- 属性 2
- 属性 3
- 属性 4 -> 重复数据删除密钥
- 属性 5 -> 状态
- UUID。
以及在此之上为 CRUD 构建的服务。
项目的初始状态是“活动”。如果调用了 CRUD API createItem
,我需要检查是否已经存在具有相同de-dupe key
和'active'
状态的项目,如果是,我需要修改此项目,否则为具有“活动”状态的相同重复数据删除密钥创建一个新项目。
我不能在重复数据删除密钥上使用 GSI 并确保单例性质。当应用程序写入或删除表中的项目时,该表上的任何全局二级索引都会使用最终一致的模型异步更新。
但是,还有其他方法可以实现这一点:
有一个不同的表以将重复数据删除键(作为主键)和活动项目 UUID 作为唯一属性。因此,DAO 与两个表进行交互以进行交互。这很痛苦,因为 DAO 必须处理 2 个表(处理原子性可能很困难)。
将重复数据删除作为 PK,将时间戳作为排序键。除活动项目外,保持时间戳为 0。并对其执行条件更新,直到其状态发生变化。但是,使用这种方法,我将失去在 UUID 上执行 batchLoad/batchGet 的能力,因为重复数据删除密钥是 PK。
任何想法,将不胜感激。谢谢。
amazon-dynamodb - 使用 OR 和 beginWith 的 DynamoDB 查询
首先,我知道我们不能在KeyConditionExpression
. 我将 I18n 密钥存储在数据库中,并且具有以下数据结构:
我还有一个 UI,其中有一个文本字段,应该允许我按任何语言文本过滤键。在这种情况下,英语或德语,由键de
和表示en
。
我想实现一个关键条件表达式如下所示的查询:
如前所述,这将是理想的,但由于我们没有OR
操作,我真的不知道如何修改查询或如何创建允许我进行此查询的 GSI。
谢谢
amazon-dynamodb - Dynamodb 查询/扫描嵌套文档。指定 GSI
我有以下 DynamoDb 文档的结构
我目前正在使用 Dynamodb Mapper 来保存文档。
我有以下问题
每次我更新表时,它都会在 DynamoDb 表中创建一条新记录?这是预期的吗?在查询时,我必须每次将 Limit 设置为 1 才能获取最新记录。是因为我有 SortKey 作为当前时间戳吗?如果我删除 sortKey 会有帮助吗?
我想执行以下查询:获取所有具有 SubjectMarks > 60 的 StudentNames 这应该返回学生 Ben,但只有 Subject Math。这可能吗?我需要使用查询还是扫描?使用 GSI 会有帮助吗?在这种情况下,我如何使用点运算符,因为主题是一个列表?