如果我想通过这些字段进行搜索,我应该如何将其存储在DynamoDB中?

时间:2018-03-23 21:52:12

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

我有一个DynamoDB表,其中包含以下键:

data._ref(值是一个uuid) - 这是主键

loader.construct_mapping(node, deep=True) - 只是常规密钥

我希望能够查询DynamoDB以获取id等于某个值的项目。

为了做到这一点,some_other_field是否需要成为排序键?

我可以改为存储一个Document项而不是键值项吗?但是,我没有找到如何做到的文档。

1 个答案:

答案 0 :(得分:1)

我猜你有一个带有键的DynamoDB (不是项目):

  • id - 字符串 - 将其命名为分区键或哈希键
  • some_other_field - 字符串|数字| blob - 如果键不在键中,则称之为排序键或范围键或常规列

无论您的情况如何,我都会使用分区键定义全局二级索引:some_other_field和投影:KEYS_ONLY

您可以使用some_other_field = VALUE查询项目的索引。因此,你永远不会扫描整个表格,只能得到你需要的东西。

// There may be some small errors in names, consider that code a hint ;)
const params = {
  TableName: 'MY_TABLE_NAME',
  IndexName: 'MY_INDEX_NAME',
  KeyConditionExpression: '#pk = :pk',
  ExpressionAttributeNames: {
    '#pk': 'some_other_field', // GSI partition key
  },
  ExpressionAttributeValues: {
    ':pk': MY_VALUE,
  },
}

这不是唯一的解决方案,您也可以使用过滤器表达式扫描表格以保留与条件匹配的项目,但它比上面的解决方案更昂贵,因为它总是扫描所有表格。