如何使用多个索引查询AWS DynamoDB?

时间:2019-05-09 02:42:16

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

我有一个具有以下项目结构的AWS DynamoDb购物车表-

{
  "cart_id": "5e4d0f9f-f08c-45ae-986a-f1b5ac7b7c13",
  "user_id": 1234,
  "type": "OTHER",
  "currency": "INR",
  "created_date": 132432423,
  "expiry": 132432425,
  "total_amount": 90000,
  "total_quantity": 2,  
  "items": [
    {
      "amount": 90000,
      "category": "Laptops",
      "name": "Apple MacBook Pro",
      "quantity": 1
    }
  ]
}

-

{
  "cart_id": "12340f9f-f08c-45ae-986a-f1b5ac7b1234",
  "user_id": 1234,
  "type": "SPECIAL",
  "currency": "INR",
  "created_date": 132432423,
  "expiry": 132432425,
  "total_amount": 1000,
  "total_quantity": 2,  
  "items": [
    {
      "amount": 1000,
      "category": "Special",
      "name": "Special Item",
      "quantity": 1
    }
  ]
}

该表将以cart_id作为主键,
user_id作为索引或GSI,
type作为索引或GSI。

我希望能够查询购物车表,
查找具有user_id = 1234 AND type != "SPECIAL"的商品。
我不知道这是否意味着查询-

--key-condition-expression "user_id = 1234 AND type != 'SPECIAL'" 

我了解无法同时使用多个索引查询AWS DynamoDb表
我遇到了以下问题,它有一个类似的用例,答案是建议创建一个复合键,
Querying with multiple local Secondary Index Dynamodb

这是否意味着在将新项目放入表格中时,
我需要维护另一列,例如user_id_type
其值为1234SPECIAL,并为user_id_type创建一个索引/ GSI?

示例项目结构-

{
  "cart_id": "5e4d0f9f-f08c-45ae-986a-f1b5ac7b7c13",
  "user_id": 1234,
  "type": "OTHER",
  "user_id_type" : "1234OTHER",
  "currency": "INR",
  "created_date": 132432423,
  "expiry": 132432425,
  "total_amount": 90000,
  "total_quantity": 2,  
  "items": [
    {
      "amount": 90000,
      "category": "Laptops",
      "name": "Apple MacBook Pro",
      "quantity": 1
    }
  ]
}

参考-
1. Querying with multiple local Secondary Index Dynamodb
2. Is there a way to query multiple hash keys in DynamoDB?

2 个答案:

答案 0 :(得分:1)

您的假设是正确的。也许您可以添加一个定界符field1_field2,或者如果它们中的任何一个的大小都太大,则对它们进行哈希处理hashOfField1_hashOfField2

但是,这意味着您需要花费更多的处理能力。由于DynamoDB本身不支持它。

Composite key in DynamoDB with more than 2 columns?

Dynamodb: query using more than two attributes

您的用例的其他信息

KeyConditionExpression仅允许用于哈希键。 您可以将其放入FilterExpression

Why is there no **not equal** comparison in DynamoDB queries?

答案 1 :(得分:0)

”这是否意味着在将新项目放入表格中时, 我将需要维护另一列,例如user_id_type, 其值为1234SPECIAL并为user_id_type创建索引/ GSI?“

答案是否取决于您需要的 多少列 (dynamodb的架构较少,按列表示数据字段),您是否对 2次来回

您的查询:      user_id = 1234并输入!=“ SPECIAL”

1- 如果您需要购物车中的所有信息,但对两次往返都很满意:

  • 解决方案::创建一个具有user_id(HASH)并键入(RANGE)的GSI,然后添加cart_id(基础表哈希键)作为投影。
  • 说明:,因此,您需要在索引表上进行一次查询才能在给定user_id和类型的情况下获得cart_id --key-condition-expression“ user_id = 1234并输入!='SPECIAL'” 那么您需要使用结果中的cart_id,并再次查询基表

2- 如果您不需要所有购物车信息

  • 解决方案::您需要创建一个GSI,并将user_id设置为HASH,然后键入RANGE并向投影添加更多列(您需要的列)。
  • 说明:投影是您希望在索引表中拥有的其他列。因此,添加一些额外的列,这些列更可能用作查询的结果,以避免额外的往返于基表的行程
  • 注意::添加过多的额外列可能会使您的费用增加一倍,因为对基表的任何更新都会导致GSI表投影字段中的更新)

3- 如果您只想一次往返,并且需要所有数据

  • 那么您需要自己进行管理,您的建议就可以应用