amazon-web-services - DynamoDB Between GSI 查询无法按预期工作

标签 amazon-web-services nosql amazon-dynamodb dynamodb-queries

它是一个jobPosts架构,其中一个属性是posted_date。目标是查询两个日期之间的所有职位发布。 以下是供您引用的架构:

{
  'job_id': {S: jobInfo.job_id},
  'company': {S: jobInfo.company},
  'title': {S: jobInfo.title},
  'posted_on': {S: jobInfo.posted_on},
}

posted_on' 基于 ISO 字符串 (2019-11-10T10:52:38.013Z)。 job_id 是主键(分区键),由于我需要查询日期,因此我在 上创建了 GSI(分区键)发布于。现在这是查询:

  const params = {
    TableName : "jobPosts",
    IndexName: 'date_for_filter_purpose-index',
    ProjectionExpression:"job_id, company, title, posted_on",
    KeyConditionExpression: "posted_on BETWEEN :startDate AND :endDate",
    ExpressionAttributeValues: {
        ":startDate": {S: "2019-10-10T10:52:38.013Z"},
        ":endDate": {S: "2019-11-10T10:52:38.013Z"}
    }
  };

我在 dynamoDB 中有一个文档,它是:

{
  job_id:,
  company: "xyz",
  title: "abc",
  posted_on: "2019-11-01T10:52:38.013Z"
} 

现在,在执行此操作时,我收到以下错误:

{
    "message": "Query key condition not supported",
    "code": "ValidationException",
    "time": "2019-11-11T06:15:37.231Z",
    "requestId": "J078NON3L8KSJE5E8I3IP9N0IBVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 12.382362030893768
}

我不知道上面的查询有什么问题。

汤米回答后更新: 我删除了 posted_on 上的 GSI,并重新创建了表,其中 job_id 作为 分区键posted_on 作为 排序键。我收到以下错误:

{
    "message": "Query condition missed key schema element: job_id",
    "code": "ValidationException",
    "time": "2019-11-12T11:01:48.682Z",
    "requestId": "M9E793UQNJHPN5ULQFJI2NR0BVVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 42.52613025785952
}

根据 this SO answerGSI 应该能够使用 BETWEEN 关键字查询日期。

最佳答案

answer you refer to涉及分区键具有特定值并且排序键在给定范围内的查询。类似于 select * from table where status=Z and date between X and Y。如果我正确地阅读了你的问题,那不是你想要做的。您想要从日期在 X 和 Y 之间的表格中选择 *。您无法使用 DynamoDB 查询执行此操作 - 您无法按范围查询分区键。

如果您知道查询日期的最大范围是在给定的一天,那么您可以创建 GSI分区键设置为计算出的日期/时间的 YYYYMMDD 值,其排序键是完整的日期/时间。然后,您可以使用关键条件表达式查询计算出的 YYYYMMDD 的分区键以及 X 和 Y 之间的排序键。为此,X 和 Y 的 YYYYMMDD 必须相同。

如果您知道查询日期的最大范围是一个月,那么您可以创建一个 GSI,其分区键设置为计算出的日期/时间的 YYYYMM,其排序键是完整的日期/时间。为此,X 和 Y 的 YYYYMM 必须相同。

关于amazon-web-services - DynamoDB Between GSI 查询无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58796834/

相关文章:

mysql - AWS SimpleDB 的 MSSQL/MySQL 支持

cassandra - 为什么我不能在过滤主键后在 Cassandra 中添加 WHERE 子句?

csv - 使用 Pig 加载文件的子集

java - 无法在 Java AWS lambda 函数中创建与 DynamoDB 的连接

c# - 如何根据哈希键删除 Amazon Dynamodb 中的记录?

ios - 对适用于 iOS 的 dynamoDB (AWS) 执行扫描或查询

java - 使用 Cognito SDK 时为什么需要提供 AWS 凭证?

c# - Redis使用的数据结构

amazon-web-services - DynamoDB 细粒度访问控制 : is it possible to use ${cognito-identity. amazonaws.com :email}?

node.js - 使用 Node.js 和 React 将视频从 AWS 流式传输到网页上