问题标签 [dynamodb-queries]

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 回答
2905 浏览

amazon-web-services - 如何使用 Appsync 中的解析器获取 dynamodb 中存在的记录总数

我是 Dynamodb 和 Appsync 的新手,我有一个名为 User 的表,其字段 id 和名称如下

通过使用突变,我插入了 5 条记录。现在我的查询是如何使用 Appsync 请求映射模板(解析器)获取 Dynamodb 表中存在的记录数,该模板可以是任何类型的模板(即查询、扫描、batchGetitem 等)。

提前致谢!!

0 投票
2 回答
1805 浏览

amazon-web-services - 如何设计关键模式以使每个应用程序只有一个 DynamoDB 表?

根据 DynamoDB 文档:https ://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html

“您应该在 DynamoDB 应用程序中维护尽可能少的表。大多数设计良好的应用程序只需要一个表。”

但是根据我的经验,由于分区键设计,您总是必须做相反的事情。

让我们考虑下一种情况。我们有几个用户角色,例如“admin”、“manager”、“worker”。管理员通常的工作流程是 CRUD 管理器数据,其中读取操作不是获取一个管理器,而是获取所有管理器列表。经理也是如此——他的 CRUD 工人数据。对于这两种情况,我们只有两种密钥使用场景:

  • 获取所有项目的列表(项目密钥无关紧要)
  • 使用其完整密钥处理特定项目。

自然地,我们应该有均匀分布的分区键(正如文档强调的那样),所以我们不能为它选择用户角色,应该使用用户 ID。由于我们已经有一些随机 id 作为分区键,我们根本不需要排序键,因为它根本不起作用 - 我们已经通过仅使用分区键部分来访问一个用户。在这一点上,我们意识到用户 id 就像 CUD 操作的魅力一样,但是对于每个 R 操作,我们需要扫描所有表,然后按用户角色过滤结果,这是无效的。如何改进?很自然 - 让我们为每个用户类型拥有自己的表格!然后我们将从管理 API 扫描经理列表,并从经理一号扫描工人列表。

我使用 DynamoDB 快一年了,仍然无法使用。对我来说,现实情况是,对于现实生活场景,排序键是你永远无法使用的(我唯一的真实情况是同时访问属于不同类型的两个用户的“协议”之类的项目,所以主键是{partion:“managerId”,排序:“userId”},二级全局索引是{partition:“userId”,排序:“managerId”},所以我可以有效地查询所有特定的经理协议列表或所有特定的用户协议列表仅提供查询的相应经理或用户 ID。该方法在此处的文档中进行了讨论:https ://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html )。

我觉得我根本不明白这个概念。对于提供的示例,对于两种用户类型仅使用一个DynamoDB 表,关键模式的有效方法是什么?

0 投票
1 回答
56 浏览

amazon-dynamodb - 优化 DynamoDB 读取消耗

我有一个表格,其中有一String列日期。样本输入是2018-12-31T23:59:59.999Z。它没有被索引。

现在,Read Capacity Consumption如果我想获取所有早于给定日期的记录,那会更好。

  1. 我应该扫描整个表并在我的脚本中应用逻辑还是
  2. 我应该在扫描记录时使用 DynamoDB 条件吗?

我要问的是,RCU 计算机是基于正在发送的结果还是在查询级别计算的。如果它是根据结果计算的,那么选项 2 是一种优化的方法,但如果不是,那也没关系。

你们有什么建议。

0 投票
2 回答
572 浏览

concurrency - DynamoDB 原子更新计数器

这里是 DynamoDB 菜鸟,有兴趣了解 NoSQL 数据库。

我有一个场景,我有一个表,它有一个 userId 的分区键、一个时间的排序键和一个数字句柄。句柄是一个递增 1 的顺序计数器。

以下是该表的示例:

对于给定的 userId,句柄不能有重复项

我想要做的是为 userId 0 添加一条新记录,时间为 891,并且句柄 1 大于 userId 0 的最后写入记录 - 这将是数据库中的倒数第二行,即 3 + 1 = 4。

天真的方法是查询数据库的 userId 为 0,按最后一个时间戳排序(如果可能的话)以获取句柄 (3)。这是第一个请求。然后,您将在数据库上创建一个 put_item 请求,该请求将 1 添加到句柄 (3 + 1 = 4) 并创建一条新记录。

显然这里存在竞争条件,在读取查询和创建 put_item 请求之间,另一个 lambda/API/endpoint 可能已经使用相同的句柄 (4) 向数据库提交了一条新记录,例如 (1, 888, 4) . 当我提交原始记录 (0, 891, 4) 时,句柄是 4,而现在应该是 5。

是否可以在单个事务中执行此读写操作(也许我的心态错误)。

如果我的问题不清楚,请告诉我。

0 投票
2 回答
64 浏览

amazon-dynamodb - Amazon DynamoDB 设置索引策略

我刚开始在 dynamodb 中工作,我想正确设置一些索引。我有一个包含以下字段的对象的表:

id -> 每个对象的唯一 ID
businessType -> 不唯一,您可以拥有多个具有相同业务类型的对象
checkType -> 不唯一,您可以拥有多个具有相同检查类型的对象
...其他字段(不重要)

现在我希望能够在不扫描的情况下高效查询:
1)仅按业务类型查询,获取具有特定业务类型的所有对象
2)按业务类型和检查类型查询,获取具有特定业务类型和检查类型的所有对象
3)仅按 id 查询,获取具有唯一 ID 的对象

我如何有效地设置索引以完成上述任务?
谢谢你。

0 投票
1 回答
83 浏览

amazon-dynamodb - 使用 LSI 的 Dynamo DB 批量调用

我有一个表,其中 customerId 和 orderId 分别作为主分区键和排序键。我在 CustomerID 和 ProductID 上有 LSI。

是否可以为特定的 customerId 批量调用多个 ProductId?是否仅对键列支持批量调用?或者也可以基于 LSI 进行批量调用?

0 投票
1 回答
845 浏览

nosql - 在 DynamoDB 中建模实体和标签

我有一个包含“目录”、“集合”等实体的应用程序。我想使用标记对实体之间的关系进行建模。例如,我可能有一个销售目录和一个销售集合。我会知道这两个实体是连接的,因为它们都有相同的标签:“销售”。

以下是我需要做的查询:

1)获取某种类型的所有实体,即目录

2) 通过 ID 获取实体

3) 获取所有带有特定标签的实体

4)通过某个标签查询实体列表,并检索与该实体关联的其余标签。

我想知道如何在 Dynamo DB 中建模

我首先认为我可以这样做:

问题是我无法获得某种类型的所有实体。(1)

我想也许我可以这样做:

我可以完成:在 SK 上使用 BeginsWith 和 EndsWith 的 1,2above 和 3 使用类型标签为 PK 但无法完成的 GSI 4。

将来我还希望能够按标签类型进行查询。我看不出在亚马逊推荐的一张表中或不使用 RDBMS 的情况下如何实现所有这些。

我真的很感激我能得到的任何意见或方向。

谢谢!

0 投票
1 回答
335 浏览

amazon-web-services - Dynamodb 表设计模式

我不确定这是否是提出这个问题的正确地方。

我是 dynamodb 的新手,并试图找出创建小型 Web 应用程序的方法。我在这里阅读了最佳实践http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/BestPractices.html

我的桌子将是:

  1. 建筑物
  2. 租户(一栋建筑可以有尽可能多的租户,由楼层号标识)
  3. 收件人(每个楼层可以有多个收件人,基本上是租户的别名)
  4. 快递员
  5. 交付(与特定收件人绑定的快递员)

我目前设计架构的方法如下所示:

为了列出所有交付以及收件人详细信息,我将需要按收件人 ID 列出的收件人详细信息。根据LSI文档,这意味着将收件人 ID 作为 Building 表中的排序键。

由于您只能拥有表格的顶级元素(收件人不是那个),因此根据指南https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/GSI.html这似乎是不可能的

索引键属性可以由基表中的任何顶级字符串、数字或二进制属性组成;不允许使用其他标量类型、文档类型和集合类型。

因此,如果不制作另一个表,我应该复制所有收件人,更新他们所有更新都发生在表中,我希望这可以实现。还有其他替代或更好的方法吗?

由于交付似乎是快递员与收件人的一对一关系,因此在列出所有交付时是否可以保留 ID 并遍历所有收件人和快递员?

0 投票
2 回答
898 浏览

amazon-dynamodb - 使用 DynamooseJs 在 DynamoDB 中进行 3 列查询

我的表是(device, type, value, timestamp),其中(device,type,timestamp)创建了一个唯一组合(非 DynamoDB DBMS 中复合键的候选者)。

我的查询可以介于这三个属性中的任何一个之间,例如

GET ( value)s from ( device) with ( type) 具有 ( timestamp) 大于 < some-timestamp>

我正在使用dynamoosejs/dynamoose。从大多数搜索中,我相信我应该使用三个字段的组合(作为单个字段 ; device-type-timestamp)作为id. 但是set: functionofSchema不允许我使用对象属性(例如this.device),并且由于某些原因,我无法在外部执行此操作。

我得到的最接近的 ( id:uuidv4:hashKey, device:string:GlobalSecIndex, type:string:LocalSecIndex, timestamp:Date:LocalSecIndex)

( id:uuidv4:rangeKey, device:string:hashKey, type:string:LocalSecIndex, timestamp:Date:LocalSecIndex)

等等..

但是,在使用 Query 时,很难获取特定device,type的结果,因为id, (hashKeyrangeKey) 总是从场景中丢失。

所以这个问题。对于这样的桌子,你会怎么做?

需要注意的是,该表旨在收集来自 IoT 设备的内容,每个设备平均每 5 分钟生成一次。

0 投票
1 回答
2972 浏览

java - DynamoDBMapper:使用嵌套对象属性的过滤器进行查询/扫描

我正在创建一个 DAO 类,它有一个 API 可以逐页获取产品。对 API 的请求将包含一个过滤器列表。过滤对原始和字符串属性按预期工作。

ScanExpression 中应更改哪些内容以过滤 category.uid?

我尝试传递属性名称,category.uid但没有帮助。

如果方法在设计方面不正确,我很高兴得到评论家的看法。如果方法不止一种,可以详细说明利弊。

此外,我在 AWS 控制台上尝试了它,但它在那里也不起作用。我的表如下所示 所有产品

其中一款产品的内容如下 检查类别字段,这是一个地图

检查类别字段,这是一个包含name和的地图uid。我尝试搜索类别名称,但没有出现任何结果。 在此处输入图像描述

AWS DynamoDB 是否甚至支持过滤嵌套属性。