问题标签 [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 投票
1 回答
163 浏览

amazon-dynamodb - 如何创建具有多个字段哈希的 DynamoDB 全局二级索引?

对我来说,“散列”这个词表明,在 DynamoDB 中散列由多个字段组成是可能的。但是,我发现的每一篇文章都显示了只包含一个值的“哈希”……这对我来说没有任何意义。

我的表由以下字段组成:

  • 用户界面 (PK)
  • 提供者
  • 标识符
  • 接收日期
  • 处理日期

目标是根据我的应用程序检索数据的方式(当然,PK 除外)建立多个索引。组合是:

  1. 通过提供者的消息标识符:
    所需哈希:提供者 + 标识符

  2. 通过会话消息标识符:
    所需哈希:从 + 到

  3. 到收到的日期以及是否已处理
    所需的哈希:_ac

  4. 到收到的日期以及是否已处理
    所需的哈希:帐户

这是我尝试过但未成功的示例之一...

0 投票
2 回答
96 浏览

aws-lambda - 基于时间的过期/生成记录/事件/操作消息

我正在为多个用户创建任务分配脚本。一个任务分配给一个用户,如果在接下来的 30 分钟内没有被接受,我需要重新分配给另一个用户。

实际上,我为此使用了 DynamoDB,每个任务分配都在 30 分钟后附加到 TTL。当 TTL 过期时,我通过 Stream 处理并检查它是否被接受。如果没有,我正在重新分配并在表中创建一个具有 30 分钟 TTL 的新条目。

我错过了 TTL 的一个概念,即它不会实时过期项目,可能需要长达 48 小时。

是否有任何其他智能方法来处理此类用例,目前我将其实现为 -

  • 添加以 TTL 作为排序键和 event_type = Task 作为分区键的索引
  • 每分钟查询 TTL 小于当前 epoch 的所有记录,并批量删除这些记录。

这里有两个挑战——

  • 首先,由于 event_type 在整个表中是恒定的,所有数据都在索引的一个分区上,这对于大容量是不利的
  • 这是一种轮询机制,我实际上需要扫描所有记录,这也不是一个可扩展的解决方案

我正在探索我们是否可以通过推送机制巧妙地做到这一点。解决此用例的任何指示或帮助?

0 投票
0 回答
47 浏览

amazon-web-services - 如何在单个 DynamoDB 表中连接 3 个实体?

我有一个简单的关系模型,我想使用单表设计在 DyanamoDB 中创建它。该模型适用于餐厅评论应用程序:

实体是:

  • 用户 => 用户有一对多评论
  • 评论 => 餐厅有一对多评论
  • 餐厅 => 评论有一个`用户

用户有一个emaildisplayName

访问模式:

  1. 列出单个用户的所有评论
  2. 列出餐厅的评论
  3. displayName使用创建评论的用户查找餐厅的所有评论。

我正在努力解决 3:使用displayName创建评论的用户查找餐厅的所有评论。

我可以存储displayName评论项目,但如果我的用户更新displayName我需要使用此显示名称更新所有评论。

我正在努力解决如何连接restaurant reviewuser在单个查询中。我得到的最接近的是:

我可以使用具有上述设计但不是 3 的 GSI 来满足模式 1 和 2。我还尝试翻转设计,以便评论与餐馆相关,但仍然无法满足模式 3。

在单个查询中,我正在尝试使用单个表设计来实现吗?即使我可以在两个可行的查询中做到这一点。

非常感谢这里的任何建议!

0 投票
1 回答
379 浏览

amazon-dynamodb - DynamoDB - 通过全局二级索引获取项目

我有一个现有的表,它有 10 个字段。字段是这样的:

AuthID, UserID, Age, Job, .etc

该表存储我的用户的数据。“AuthID”是主键,“UserID”是全局二级索引。

当我通过 AuthID 获取项目时,一切都很好。但我无法通过 UserID 获取项目。我尝试了 GetItem、Query 和 Scan 方法,但在所有三种方法中都失败了。

我需要能够使用我在下面编写的这 3 种方法获取数据:

AuthID 和 UserID 是唯一的。有人可以指出我该怎么做的正确方法吗?

0 投票
1 回答
235 浏览

amazon-dynamodb - 在 DynamoDB 的单个查询中获取父项和子项

我有以下一对多的关系:

Account包含全局帐户级别的信息,这些信息是可变的。

包含用户级别的信息,这些User信息也是可变的。

当用户登录时,他们需要AccountUser信息。(我只知道UserId此时)。

理想情况下,我希望设计架构,以便需要单个查询。Account但是,如果不复制到每个对象中,我无法确定如何执行此操作User,因此需要一些后台 Lambda 作业来将更改传播到Account所有User对象的属性——据记录,这似乎比简单地使用更多的资源(和要维护的代码)规范化数据并在每次登录时进行 2 次查询:获取用户,然后获取帐户(使用标识帐户的用户对象内的 FK)。


是否可以设计一种模式,允许一个查询同时获取两者并且不需要非事务性后台作业来传播更新?(事务批量更新是不可能的,因为有超过 25 个用户。)如果不是,那么 2-query 的想法是最好的/可接受的方法吗?


0 投票
1 回答
530 浏览

amazon-web-services - AWS BatchGetItem 与 GetItem 并行

使用与并行BatchGetItem发布几个有很大差异(时间性能)吗?GetItem

GetItem如果我可以使用并自己处理并行化,我的代码会更简洁。

但是,如果有明确的时间性能优势,BatchGetItem那么我肯定会使用它。

0 投票
2 回答
192 浏览

amazon-dynamodb - DynamoDB 二级索引不唯一?

我设置了一个只有分区键(没有排序键)的二级索引,但我发现实际上我可以插入多个具有相同分区键的项目。

如果我使用二级索引中的分区键发出查询,我将获得分区键等于给定分区键值的所有项目。

我是 DynamoDB 的初学者,我想知道是否设置只有一个分区键的二级索引,但是插入多个具有相同分区键的项目是个好主意。

我正在使用 Amplify.js 并拥有这个 GraphQL 架构:

如您所见,该Career表有一个二级索引byOwner,其分区键关联owner(无排序键)。但我可以正常查询careersUserMeta

与传统的RDBMS,索引列不能相同,我不知道为什么在DynamoDB中这是可能的,这是DynamoDB中的最佳实践吗?

byOwner我应该为索引设置排序键吗?也许排序键可以是id列?

0 投票
1 回答
878 浏览

amazon-dynamodb - 通过 GSI 使用 AppSync SDK 和 Amplify CLI 查询 DynamoDB

我正在尝试使用 AWS 的 Android AppSync SDK 和 Amplify CLI 通过 AWS AppSync 查询 DynamoDB 表。我正在查询全球二级索引 (GSI)。我收到一个错误:

表达式块 '$[query]' 需要一个表达式

我发现了一个类似的问题,它建议了下面的修复。但是,它对我不起作用:

schema.graphql的是:

在 DynamoDB 中正确创建了哈希键(主键 + 辅助键)和两个 GSI(GSI-item-1、GSI-order1)。我还可以使用 GSI 从 AppSync 查询我的 DynamoDB 表:

但是,当我尝试在我的 Android 应用程序中使用自动生成的放大类时,它不起作用,如下所示:

我遇到了上面提到的同样的错误。阅读相关问题后,我的理解是在 AppSync 中实现 GSI 的方式存在一些错误/不一致/限制,因此您不仅需要指定 GSI 的主键,还需要指定排序键和排序顺序为出色地。有了这些知识,为了测试,我将我的函数重写为:

不幸的是,我仍然遇到同样的错误:

表达式块 '$[query]' 需要一个表达式

我正在使用 Amplify CLI 版本 4.27.2。所有帮助将不胜感激!

编辑 1
我试图简化我的案例。我创建了只有一列的 GSI。请看schema.graphql下面:

现在我正在尝试下面的代码通过 Amplify & AppSync 查询我的发电机表:

上面的执行最终会出现与以前相同的错误:

这让我觉得我做错了什么。基本上我无法通过 GSI 在 Amplify 中查询表。不幸的是,我没有看到我的错误。
问候

0 投票
1 回答
153 浏览

amazon-web-services - Dynamo Db SDK for .NET - 按键查询数据的最佳方式是什么?

IDynamoDBContext从官方 AWS SDK for DynamoDb 看到有不同的方法来查询存储的数据:

QueryFilter传递给FromQueryAsync()QueryOperationConfig使用的方法有一个方法,用于使用名为keyAttributeName的第一个参数添加查询条件。

这是否意味着FromQueryAsync()使用正确类型的条件(对于键属性)查询 DynamoDb 的执行速度与通过主键调用查询数据的速度一样快LoadAsync(hashKey)

换句话说,对方法A和方法的调用B在性能上是否相似?

0 投票
1 回答
79 浏览

amazon-web-services - 如何减少查询时间 DynamoDB

我正在设置 DynamoDB。我们的数据很简单,它有四个字段:

  1. 用户名
  2. 用户移位结束日期
  3. 用户项目代码
  4. 用户活动

理想情况下,我们应该根据UserShiftEndDate. 我们数据中的所有字段/组合都不是唯一的。我可以为每条记录添加一个自动生成的 ID。

请建议我选择哪些字段作为分区键和排序键或 GSI,以获得基于UserShiftEndDate.

例如,考虑下表:

用户名 用户移位结束日期 用户项目代码 用户活动
用户A 2020 年 12 月 13 日 45 监控
用户B 2020 年 12 月 14 日 47 测试
用户c 2020 年 12 月 17 日 45 监控
用户B 2020 年 12 月 14 日 45 测试
用户C 2020 年 12 月 15 日 47 管理

我的查询应将日期作为输入,并应返回shiftEndDate晚于或等于给定日期的所有用户数据。

例如,如果输入 12/14/2020,则查询应返回除第 1 行之外的所有用户数据。

我们计划以即时形式存储日期。为了简单起见,我在这里提到了它作为日期