【问题标题】:OR condition in dynamoDB querydynamoDB 查询中的 OR 条件
【发布时间】:2017-03-02 11:26:44
【问题描述】:

我想根据列 status_code 查询 dynamoDB 表。我使用以下代码获取输出:

params = {
    TableName : "Orders_" + environment,
    IndexName: "StatusCode-StoreID-index",
    KeyConditionExpression: "StatusCode = :status_code",
    ExpressionAttributeValues: {
      ":status_code": "ST01"
    },
    ScanIndexForward: false,
    Limit : ordersPageSize
  };

在这里,我将 status_code 作为 ST01 传递。我的问题是关于传递多个值而不是 ST01。 如何获取status_code值为ST01或ST02或ST03的记录?

【问题讨论】:

    标签: node.js amazon-dynamodb nosql


    【解决方案1】:

    根据DynamoDB Query Documentation

    排序键条件的有效比较如下:

    • sortKeyName = :sortkeyval - 如果排序键值等于 :sortkeyval,则为 true。
    • sortKeyName
    • sortKeyName
    • sortKeyName > :sortkeyval - 如果排序键值大于 :sortkeyval,则为 true。
    • sortKeyName >= :sortkeyval - 如果排序键值大于或等于 :sortkeyval,则为 true。
    • sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2 - 如果排序键值大于或等于 :sortkeyval1 且小于则为 true 或等于 :sortkeyval2。
    • begins_with (sortKeyName, :sortkeyval ) - 如果排序键值以特定操作数开头,则为 true。 (您不能使用此功能 使用 Number 类型的排序键。)

    注意函数名begins_with区分大小写。

    因此,范围仅支持 AND没有 IN。您也可以尝试使用 begins_with

    您的场景可以转换为以下代码:

    params = {
        TableName : "Orders_" + environment,
        IndexName: "StatusCode-StoreID-index",
        KeyConditionExpression: "begins_with(StatusCode, :status_code)",
        ExpressionAttributeValues: {
          ":status_code": "ST0"
        },
        ScanIndexForward: false,
        Limit : ordersPageSize
    };
    

    我希望这会有所帮助。

    【讨论】:

    • 但这将给出以 ST0 开头的任何内容。我只需要 ST01、ST02 和 ST03。
    • @PETER,您可以对 ST01、ST02 和 ST03 使用单独的 3 个查询,然后将它们合并。否则对不起,Dynamodb 不支持 IN Query 这样的功能,所以你不能搜索这样的数据。
    【解决方案2】:

    您可以在FilterExpression 上使用IN 运算符。

    params = {
        TableName : "Orders_" + environment,
        IndexName: "StatusCode-StoreID-index",
        KeyConditionExpression: "StatusCode = :status_code1",
        ExpressionAttributeValues: {
          ":status_code1": "ST01"
        },
        ScanIndexForward: false,
        Limit : ordersPageSize
      };
    

    如果你想获得多个状态(即哈希键),你可以使用batchGetItem API。但是,batchGetItem 不支持索引。您只能在主表上使用此 API。

    【讨论】:

    • 我试过了,但是得到这个错误 "message": "Invalid operator used in KeyConditionExpression: IN", "code": "ValidationException"
    • 对不起,在 KeyConditionExpression 中只能使用相等运算符。 IN 可用于过滤器表达式。
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2011-03-18
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多