【问题标题】:dynamodb query keyConditionExpression sort by sortkeydynamodb 查询 keyConditionExpression 按 sortkey 排序
【发布时间】:2021-05-07 16:09:43
【问题描述】:

我正在尝试按排序和键对我的 dynamo db 结果进行排序,并且还根据排序键获取一系列值,并且我不断收到无效的键条件表达式错误。基本上我试图根据我的排序键获取一系列值并对它们进行排序。

保存的数据库项目示例:

{
id: ORDER_287d6df3-bd9f-472d-87ef-ee9b810b5874
issued_at: 2021-05-07T15:09:11.894Z
base_cur: NGN
orderRate(GSI): SELL#500
quantity: 300
quantityRemaining: 300
quantityRemoved: 0
quote_cur: GBP
rate: 500
side: SELL
ticker(GSI): GBP#NGN
}

我尝试过的:

const params = {
        TableName: process.env.ORDERS_TABLE_NAME,
        IndexName: 'ticker_orderRate',
        KeyConditionExpression: `ticker = :ticker and orderRate between :maxRate and :baseRate`,
        ExpressionAttributeValues: {
            ':ticker': `${quote_cur}#${base_cur}`,
            ':maxRate': `${side === 'BUY' ? 'SELL' : 'BUY'}#${rate}`,
            ':baseRate': `${side === 'BUY' ? 'SELL' : 'BUY'}#0.00`,
        }
    };

速率是来自 SNS 主题的数字。

错误信息:

ERROR: ValidationException: Invalid KeyConditionExpression: The BETWEEN operator requires upper bound to be greater than or equal to lower bound; lower bound operand: AttributeValue: {S:BUY#620}, upper bound operand: AttributeValue: {S:BUY#0.00}

有没有办法在查询数据库时将汇率和基本汇率转换为数字?还有我如何按升序排序? 感谢您的帮助

【问题讨论】:

  • 您收到的实际错误消息是什么?您如何查询这些数据(即客户端是什么)?
  • 我已将错误消息添加到问题中,并且我在 AWS 开发工具包中使用了 javascript

标签: javascript typescript amazon-web-services lambda amazon-dynamodb


【解决方案1】:

问题出在您的BETWEEN 子句中。正如错误消息所述,上限(第二个值)必须大于或等于下限(第一个值)。

这里有几点需要考虑。

  1. 请记住,这是您要排序的字符串,而不是数字。您需要进行一些调整来处理这个问题。
  2. 您需要确保号码的长度始终相同。这可以通过对值进行零填充来实现(例如,1.23 变为 001.23)。确保将零填充到一个始终与您预期的最大数字一样长或更长的值。
  3. 如果您支持负值,那么您也需要明确表示正值。在正数上加上一个加号 (+)。
  4. 以正确的顺序动态调整上下限。如果第一个值小于第二个,则离开,如果第一个值大于第二个,则交换它们的顺序。

Key Condition Expression

【讨论】:

  • 如果 dynamoDB 只接受 keyConditionExpression 中的字符串,您能否解释一下如何使用数字进行排序和/或查询?
  • 它不仅接受字符串。您选择了一个字符串作为排序键。如果您的排序键是一个数字,那么它将作为一个数字排序。
猜你喜欢
  • 1970-01-01
  • 2019-09-26
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多