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

amazon-dynamodb - DynamoDB 分区设计

我对 DynamoDB 比较陌生,我们正在为我们的一个应用程序设计一个自由格式的搜索 GUI。我们使用的主要数据存储是传统的关系数据库,我们计划使用 DynamoDB 作为数据库顶部的持久“缓存”层,仅用于搜索。

在我们的例子中,我们有 3 个键来确定客户。

我们将客户存储为上述 3 个 ID 的组合,如下所示:

  1. billingAccountNumber + customerId
  2. billingAccountNumber + InstanceId
  3. 客户ID
  4. 实例 ID

DynamoDB 中的每个项目都代表在特定时间发生在客户身上的事件。

在 DynamoDB 中设计这种模式的最佳方法是什么。查询将类似于

  1. 一段时间内某些 billingAccountNumber 的事件。
  2. 一段时间内特定客户 ID 的事件
  3. 一段时间内某个 instanceId 的事件。

等等

目前,我使用 BillingAccountNumber 作为分区键,因为这将平均分配负载,并使用时间戳作为排序键,以便我们可以获得给定范围的结果。

我正在讨论是否可以使用 customerId 或 instanceId 作为排序键,并使用时间戳作为过滤器,以便我可以在时间戳上使用 filterExpression 进行查询。

就性能和成本而言,哪种方式更有效?

0 投票
1 回答
481 浏览

amazon-dynamodb - 如何使用 AWS DynamoDB 请求单个记录?代码示例不起作用

我已经将代码示例放在了最基本的基础上,但我仍然无法通过密钥检索单个记录。这是我使用 nodejs 的基本示例(此代码段中未包含凭据):

在上面的示例中运行此代码会给我以下错误:

ValidationException:提供的关键元素与架构不匹配

我的数据集很容易插入,系统中的记录如下例所示:

该表定义如下:

表名:newsarticles

主分区键: id(字符串)

主排序键: 添加(数字)

错误消息并没有真正告诉我问题所在。谁能看到我的请求有什么问题?是否有另一种方法来诊断可能丢失或不正确的内容?在此先感谢,对于 NOOB 问题,我很抱歉,但我只是第一次开始使用 AWS DynamoDB。

0 投票
1 回答
4163 浏览

python - 根据表dynamodb python中的存在更新或插入项目

问题

我正在尝试逐项查看表格,以便如果一个项目已经存在,那么我应该能够更新它,如果没有,那么我应该能够插入它。

但是,我了解到更新也可以像 upsert(update/insert) 一样工作。我的情况也不适合。

我的情况

  1. 检查item表中是否存在并存储flag(布尔值)
  2. 检查是否flag0,(项目不可用)然后,插入项目并将当前时间戳添加到列中Inserted_dttm
  3. 检查是否flag1,(项目可用)然后更新项目并将当前时间戳添加到列中Updated_dttm(而不是 Inserted_dttm)

试用

我一直在寻找query()是一个不错的选择get_item(),但是任何一个都欢迎您的解决方案。

0 投票
0 回答
261 浏览

amazon-web-services - 为什么 DynamoDB 嵌套属性的深度限制为 32 级?

根据 DynamoDB 文档,它支持最多32 级深度的嵌套属性。

我不明白为什么深度有限制,因为 DynamoDB 是键值 noSql 数据库。

为什么会有这样的限制?它与实施有关吗?

0 投票
0 回答
77 浏览

amazon-web-services - AWS DynamoDB filterexpression 具有多个带有 QueryRequest 的 IN 条件子句

当我们在 QueryRequest 中使用多个 IN 条件子句时,它仅与 IN 条件中提供的第一项匹配的数据。

我有 Json 格式有

0 投票
1 回答
1467 浏览

arrays - DynamoDb:UpdateExpression 用于更新数组

Env:aws-sdk用于与 DynamoDb 交互的 NodeJS 服务。

问题:当我将一个项目的属性设置为一个数组时,它被保存为一个字符串。我期望 x: ['1'] 但我得到 x: '1'。我相信这是因为我写错了我的 UpdateExpression/ExpressionAttributeValues。

情况:我有一个表,其中有一个名为users. 用户是一个uuids可以更新的数组。表中项目的示例:

我想用 user 更新 users 数组uuid。对于我的更新功能,我通过:

更新函数(数据为{ users: ['13245395'] }):

我得到的结果是

但我所期望的是:

以前试过:

  1. 在创建参数时将 data.users 包装在一个数组中(适用于第一个 id,但添加的第二个 id 被附加到与第一个相同的字符串中,因此它看起来像 ['123,456'] 而不是 ['123', '456']。

    UpdateExpression: "set users = :users", ExpressionAttributeValues:{ ":users": [ ${data.users}] },

  2. 使用“L”和“S”数据类型来确定它是一个字符串数组,即

    UpdateExpression: "set users = :users", ExpressionAttributeValues:{ ":users": { "L": { "S": ${data.users}} } },

0 投票
1 回答
1387 浏览

amazon-dynamodb - 对 GSI 进行条件检查的 DynamoDBSaveExpression

我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于 GSI。

实际上,如果给定的属性(即 GSI 的哈希)已经存在,我希望保存失败。

例如,在一个虚构的员工表中,“SSN”是哈希键,“EmployeeId”上有一个 GSI。这两个属性都必须是独一无二的。在保存员工时,我想确保“SSN”或“EmployeeId”都没有在表中使用。我可以为表的散列(即 SSN)做到这一点,但不能为 GSI 的散列做到这一点。

是否支持?我在文档中没有看到。

谢谢!

0 投票
1 回答
702 浏览

amazon-dynamodb - 是否可以更新作为 DynamoDB 中主键一部分的属性值?

我有“RefNumber”、“status”和“Date”的表格。“RefNumber”是分区键,“Status”是排序键所以,两者都是主键。

现在获取此记录后,我想用“1”更新“状态”。我有多个工作人员读取 DynamoDB 记录,只是为了避免任何 2 个工作人员处理相同的记录,我想使用 ConditionExpression 使用“1”获取和更新“状态”,如果更新成功,工作人员将处理否则它将跳过。

我的问题是,更新作为 dynamodb 中主键一部分的属性值是否是一个好的设计

0 投票
3 回答
10937 浏览

node.js - dynamodb 通过 id 数组获取所有项目

我有一个带有名称 id 和 HASH 类型的属性的表。我想从一组 id 中获取所有项目。

我应该怎么做才能通过我的 id 获取所有项目?

0 投票
1 回答
487 浏览

amazon-web-services - DynamoDB QuerySpec {MaxResultSize + 过滤表达式}

来自 DynamoDB文档

Query 操作允许您限制它在结果中返回的项目数。为此,请将 Limit 参数设置为所需的最大项目数。

例如,假设您查询一个限制值为 6 且没有过滤器表达式的表。查询结果将包含表中与请求中的关键条件表达式匹配的前六个项目。

现在假设您将过滤器表达式添加到查询。在这种情况下,DynamoDB 会将过滤器表达式应用于返回的六个项目,丢弃不匹配的项目。最终查询结果将包含 6 个或更少的项目,具体取决于过滤的项目数。

看起来下面的查询应该(至少有时)返回 0 条记录。

总之,我有一个 UserLogins 表。一个简化的版本是:

现在,假设 UserId = X 在不同的 DeviceId 中有 10,000 个非活动登录和 1 个活动登录。

但是,当我对我的 DynamoDB 表运行此查询时:

我总是得到 1 行。UserId=X 的 1 个活动登录。而且它不仅仅发生在 1 个用户身上,它也发生在类似情况下的多个用户身上。

我的结果是否与 DynamoDB 文档相矛盾?

这看起来很矛盾,因为如果 maxResultSize=10,则意味着 DynamoDB 将仅读取前 10 个项目(共 10,001 个),然后它将仅应用过滤器 active=true(可能返回 0 个结果)。active=true 的记录似乎不太可能出现在 DynamoDB 读取的前 10 条记录中。

这发生在数百名运行类似查询的客户身上。它工作得很好,根据文档它不应该工作。