Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用本地二级索引:Java

您可以使用 AWS SDK for Java 文档 API 创建具有一个或多个local secondary index的表,描述表中的索引,并且使用索引执行查询。

下面是使用 AWS SDK for Java 文档 API 执行表操作的常见步骤。

  1. 创建 DynamoDB 类的实例。

  2. 通过创建对应的请求数据元,为操作提供必需参数和可选参数。

  3. 调用您在前面步骤中创建的客户端提供的适当方法。

创建含有本地二级索引的表

必须在创建表的同时创建本地二级索引。要创建这些索引,请使用 createTable 方法并提供一个或多个local secondary index的规格。以下 Java 代码段创建一个包含音乐精选中歌曲信息的表。分区键为 Artist,排序键为 SongTitleAlbumTitleIndex 这一二级索引可以按专辑名称进行查询。

下面是使用 DynamoDB 文档 API 创建带有local secondary index的表的步骤。

  1. 创建 DynamoDB 类的实例。

  2. 创建 CreateTableRequest 类实例,以提供请求信息。

    您必须提供表名称、主键以及预置吞吐量值。对于local secondary index,您必须提供索引名称、索引排序键的名称和数据类型、索引的键架构以及属性投影。

  3. 以参数形式提供请求对象,以调用 createTable 方法。

以下 Java 代码段执行的就是上述步骤。该代码段创建一个表 (Music),该表包含针对 AlbumTitle 属性的二级索引。投影到索引的属性只有表的分区键、排序键以及索引排序键。

Copy
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); String tableName = "Music"; CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName); //ProvisionedThroughput createTableRequest.setProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits((long)5).withWriteCapacityUnits((long)5)); //AttributeDefinitions ArrayList<AttributeDefinition> attributeDefinitions= new ArrayList<AttributeDefinition>(); attributeDefinitions.add(new AttributeDefinition().withAttributeName("Artist").withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition().withAttributeName("SongTitle").withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition().withAttributeName("AlbumTitle").withAttributeType("S")); createTableRequest.setAttributeDefinitions(attributeDefinitions); //KeySchema ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>(); tableKeySchema.add(new KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH)); //Partition key tableKeySchema.add(new KeySchemaElement().withAttributeName("SongTitle").withKeyType(KeyType.RANGE)); //Sort key createTableRequest.setKeySchema(tableKeySchema); ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>(); indexKeySchema.add(new KeySchemaElement().withAttributeName("Artist").withKeyType(KeyType.HASH)); //Partition key indexKeySchema.add(new KeySchemaElement().withAttributeName("AlbumTitle").withKeyType(KeyType.RANGE)); //Sort key Projection projection = new Projection().withProjectionType(ProjectionType.INCLUDE); ArrayList<String> nonKeyAttributes = new ArrayList<String>(); nonKeyAttributes.add("Genre"); nonKeyAttributes.add("Year"); projection.setNonKeyAttributes(nonKeyAttributes); LocalSecondaryIndex localSecondaryIndex = new LocalSecondaryIndex() .withIndexName("AlbumTitleIndex").withKeySchema(indexKeySchema).withProjection(projection); ArrayList<LocalSecondaryIndex> localSecondaryIndexes = new ArrayList<LocalSecondaryIndex>(); localSecondaryIndexes.add(localSecondaryIndex); createTableRequest.setLocalSecondaryIndexes(localSecondaryIndexes); Table table = dynamoDB.createTable(createTableRequest); System.out.println(table.getDescription());

您必须等待 DynamoDB 创建该表并将表的状态设置为 ACTIVE。然后,您就可以开始在表中添加数据元项目。

描述含有本地二级索引的表

要获取有关表中的local secondary index的信息,请使用 describeTable 方法。对于每个索引,您都可以查看其名称、键架构和投影的属性。

下面是使用 AWS SDK for Java 文档 API 访问表中的local secondary index信息的步骤

  1. 创建 DynamoDB 类的实例。

  2. 创建 Table 类的实例。您必须提供表名称。

  3. 调用 Table 对象上的 describeTable 方法。

以下 Java 代码段执行的就是上述步骤。

Copy
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); String tableName = "Music"; Table table = dynamoDB.getTable(tableName); TableDescription tableDescription = table.describe(); List<LocalSecondaryIndexDescription> localSecondaryIndexes = tableDescription.getLocalSecondaryIndexes(); // This code snippet will work for multiple indexes, even though // there is only one index in this example. Iterator<LocalSecondaryIndexDescription> lsiIter = localSecondaryIndexes.iterator(); while (lsiIter.hasNext()) { LocalSecondaryIndexDescription lsiDescription = lsiIter.next(); System.out.println("Info for index " + lsiDescription.getIndexName() + ":"); Iterator<KeySchemaElement> kseIter = lsiDescription.getKeySchema().iterator(); while (kseIter.hasNext()) { KeySchemaElement kse = kseIter.next(); System.out.printf("\t%s: %s\n", kse.getAttributeName(), kse.getKeyType()); } Projection projection = lsiDescription.getProjection(); System.out.println("\tThe projection type is: " + projection.getProjectionType()); if (projection.getProjectionType().toString().equals("INCLUDE")) { System.out.println("\t\tThe non-key projected attributes are: " + projection.getNonKeyAttributes()); } }

查询本地二级索引

您可以在local secondary index中使用 Query 操作 (基本与对表执行 Query 操作一样)。您需要指定索引名称、索引排序键的查询条件以及要返回的属性。在本示例中,索引为 AlbumTitleIndex,索引排序键为 AlbumTitle。

要返回的只包含投影到索引的属性。您也可以修改此查询,让返回结果中也包含非键属性,但是这样会导致表抓取活动的成本相对较高的。有关表抓取的更多信息,请参阅属性投影

下面是使用 AWS SDK for Java 文档 API 查询local secondary index的步骤。

  1. 创建 DynamoDB 类的实例。

  2. 创建 Table 类的实例。您必须提供表名称。

  3. 创建 Index 类的实例。您必须提供索引名称。

  4. 调用 Index 类的 query 方法。

以下 Java 代码段执行的就是上述步骤。

Copy
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); String tableName = "Music"; Table table = dynamoDB.getTable(tableName); Index index = table.getIndex("AlbumTitleIndex"); QuerySpec spec = new QuerySpec() .withKeyConditionExpression("Artist = :v_artist and AlbumTitle = :v_title") .withValueMap(new ValueMap() .withString(":v_artist", "Acme Band") .withString(":v_title", "Songs About Life")); ItemCollection<QueryOutcome> items = index.query(spec); Iterator<Item> itemsIter = items.iterator(); while (itemsIter.hasNext()) { Item item = itemsIter.next(); System.out.println(item.toJSONPretty()); }