如何仅通过 DynamoDB 中组合键的一部分进行查询?

2024-04-18

比方说,我有User正在写评论Products.

用户和产品是具有自己的 id 的独立实体。

Review是一个复合实体,由以下组成userId and productId.

我创建了一个表review在 DynamoDB 中同时具有userId and productId作为哈希键。

aws dynamodb create-table --table-name review \
  --attribute-definitions \
      AttributeName=user_id,AttributeType=S \
      AttributeName=product_id,AttributeType=S \
  --key-schema \
      AttributeName=user_id,KeyType=HASH \
      AttributeName=product_id,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 

从而使得userId+productId复合键。

评论数据对象是根据该密钥保存的。

查询用户和产品的评论是可以的。

但是如何查询用户的所有评论或产品的所有评论呢?

使用单个参数,例如如果我通过单键条件表达式进行查询"#user_id = :userId"要不就"#product_id = :productId"

我收到表格错误

Query condition missed key schema element: user_id

or

Query condition missed key schema element: product_id

我在 DynamoDB 中创建了一个表审核,其中 userId 和 ProductId 作为 HASH 键。

您已为查看表创建了一个复合主键,其中包含以下分区键userId和一个排序键 'productId' 。你做到了not创建两个 HASH 键。

从逻辑上讲,您的评论表将如下所示(为了说明目的,我编造了一些数据):

这种表结构可以很容易地获取用户的评论。这是查询所有评论的示例USER#ABC

ddbClient.query(
  "TableName": "<YOUR TABLE NAME>",
  "KeyConditionExpression": "#userId = :userId",
  "ExpressionAttributeValues": {
    ":userId": {
      "S": "USER#ABC"
    }
  },
  "ExpressionAttributeNames": {
    "#userId": "userId"
  }
)

这将返回由 USER#ABC 审阅的项目集合。

DynamoDB 将not允许您通过以下方式获取项目only指定排序键(例如productId)。你always需要提供分区键。那么如何获得评论过给定产品的用户列表呢?

如果您想搜索评论过单个产品的所有用户,您可以引入一个全局二级索引来交换表的分区键和排序键。这种模式被称为倒排索引 https://aws.amazon.com/getting-started/hands-on/design-a-database-for-a-mobile-app-with-dynamodb/5/#:%7E:text=An%20inverted%20index%20is%20a,primary%20key%20for%20your%20table.。使用上面的示例,倒排索引将如下所示:

这将允许您通过 ProductId 获取用户:

ddbclient.query(
{
  "TableName": "<YOUR TABLE NAME>",
  "IndexName": "reviews_by_product_index",
  "KeyConditionExpression": "#productId = :productId",
  "ExpressionAttributeValues": {
    ":productId": {
      "S": "PRODUCT#456"
    }
  },
  "ExpressionAttributeNames": {
    "#productId": "productId"
  }
}
)

此查询将返回代表评论的两个项目的集合PRODUCT#456.

使用复合主键时,您can根据条件进行搜索sort key只要您还指定分区键。这有点拗口,但它允许您执行类似(伪代码)的查询

查询其中分区键=“USER#ABC”且排序键begins_with“Product”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅通过 DynamoDB 中组合键的一部分进行查询? 的相关文章

  • 将 dynamodb 表复制到 hive 的 pyspark 代码问题:不允许操作

    我正在尝试使用 pyspark 代码从 aws emr 上的 Dynamodb 创建外部配置单元表 当我在 hive 提示符下执行查询时 该查询工作正常 但当我将其作为 pyspark 作业执行时 该查询会失败 代码如下 from pysp
  • 如何使用 boto 循环 DynamoDB 表中的所有项目?

    我想查询 DynamoDB 表并检索所有项目并使用 boto 循环它们 如何构建返回表中所有内容的查询或扫描 初步支持Scan API http docs amazonwebservices com amazondynamodb lates
  • 检索 DynamoDB 上以指定文本开头的列的所有项目

    我在 DynamoDB 中有一个表 Id int hash key Name string 还有很多列 但我省略了 通常 我只是根据项目的 ID 提取和更新项目 这个模式非常适合这种情况 然而 要求之一是有一个基于名称的自动完成下拉框 我希
  • 使用 ExclusiveStartKey 选项进行 AWS Dynamodb 扫描

    对于我最近的项目 我试图从 dynamodb 获取数据 除了我在参数中添加 exclusiveStartKey 选项之外 似乎一切正常 下面是我的代码 function scanDataFromDB datetime let params
  • DynamoDB:如何使用查询过滤器检查 MAP 中的条件

    我有一张表 结构如下 当我进行查询时 我希望能够对数据图进行查询过滤 但我不太确定如何设置查询 这是我到目前为止所拥有的 HashMap
  • 具有“Limit”参数的 DynamoDB SCAN 操作成本

    我对 AWS DynamoDB 还很陌生 在阅读了文档后 我不能 100 确定使用 Limit 中的参数SCAN手术 我知道应该设计表格以便QUERY主要使用操作 并且SCAN会扫描整个表 从而消耗大量的读取能力 我还了解到 FilterE
  • 玩!框架+DynamoDB

    作为 Play 框架的新手 我想知道它是否比我想象的更容易 但是是否可以将 DynamoDB 与 Play 框架一起使用 由于 DynamoDB 是一个 NoSQL 数据库 我预计您需要使用特定的模块 而由于 Dynamo 最近才发布 因此
  • Number 类型的 DynamoDB 属性中可以存储多少位整数数据?

    DynamoDB 的Number https docs aws amazon com amazondynamodb latest developerguide HowItWorks NamingRulesDataTypes html How
  • 如何使用dynamoose查询本地dynamoDB?

    作为一名开发人员 我不想一直连接到 Amazon Web 服务 我在本地计算机上安装了 DynamoDB 引用了AWS Docs https docs aws amazon com amazondynamodb latest develop
  • 通过数据管道截断 DynamoDb 或重写数据

    可以通过数据管道转储 DynamoDb 也可以将数据导入 DynamoDb 导入进展顺利 但数据始终附加到 DynamoDb 中已存在的数据 目前 我找到了扫描 DynamoDb 并逐一或通过批量删除项目的工作示例 但无论如何 对于大量数据
  • 在 dynamodb 中搜索文本,分解表格

    目前 我正在考虑如何使用 AWS DynamoDB 在文本字符串中搜索关键字 例如 在字符串 I m a very happy man 中搜索 happy 并返回该文本 有办法查询这个吗 我所知道的是 查询允许 开始 或 之间 这在这种情况
  • DynamoDB:键及其含义

    我对如何使用 DynamoDB 表键感到困惑 该文档提到了 HASH 似乎也称为分区 键和 RANGE 或排序 键 我试图将这些与我之前对数据库索引理论的理解大致保持一致 我目前主要基于猜测的理解是 HASH 键本质上是主键 它必须是唯一的
  • 在dynamodb中使用batchWriteItem

    我的 dynamo 数据库中有两个表 一个是候选表 另一个是用户表我想在 dynamo 数据库中使用 batchWriteItem 以便在表中添加数据 我格式化的查询如下 var user userid usrid role candida
  • 一个或多个参数值无效:键 xyz 的类型不匹配预期:S 实际:M

    我的 AWS Lambda 根据以下答案调用 DynamoDB https stackoverflow com a 33649402 495455 https stackoverflow com a 33649402 495455 我收到错
  • Amazon DynamoDB 使用无服务器修改结构

    修改 DynamoDB 表结构的最佳方法是什么 由于备份而删除它没有问题 我有一个只有哈希键的表 我必须为表添加一个排序键 当我部署堆栈时 我收到此错误 错误 CloudFormation 模板无效 模板格式错误 模板的资源块中存在未解析的
  • 全文搜索 DynamoDB

    以下情况 我正在为我的客户将元素存储在 DyanmoDb 中 HashKey 是元素 ID Range Key 是客户 ID 除了这些字段之外 我还存储一个字符串数组 gt 标签 例如 Pets House 和多行文本 我想在我的应用程序中
  • 获取 emr-ddb-hadoop.jar 将 DynamoDB 与 EMR Spark 连接

    我有一个 DynamoDB 表 需要将其连接到 EMR Spark SQL 才能对该表运行查询 我获得了带有发行标签 emr 4 6 0 和 Spark 1 6 1 的 EMR Spark Cluster 我指的是文档 使用 Spark 分
  • 由于命名约定,使用 DynamoDB AWS SDK [无哈希键映射] 时出错

    在使用 AWS JAva SDK 时 为了定义 DynamoDBHashKey 我们使用 DynamoDBHashKey 注释 奇怪的是 如果我使用如下注释 DynamoDBHashKey String Abc 代替 DynamoDBHas
  • 更新 DynamoDB 中的多条记录

    如何在单个查询中更新 DynamoDB 中的多条记录 我有一个 csv 文件作为基于 csv 文件的输入 我必须更新数据库中的多条记录 只有一个属性 有可用的 API 吗 或者这可以使用批处理 Spring batch 来完成 Dynamo
  • 嵌套字段索引

    我正在尝试使用 AWS 开发人员控制台中的仪表板在嵌套字段上创建索引 例如 如果我有以下架构 id 1 nested mode mode1 text nice text 我能够创建索引nested mode 但是每当我通过索引进行查询时 就

随机推荐