web-dev-qa-db-ja.com

HashKeyと範囲キーに基づいてDynamoDBでクエリを実行するにはどうすればよいですか?

DynamoDbは初めてです。 hashKeyrangeKeyを使用してDynamoDBのテーブルにクエリを実行する方法を知りたいだけです。

テーブルがTestTableで、スキーマが次のようなものだとします。

1.Id (HK of type String)
2 Date (RK of type String )
3 Name (attribute of type String)

ここで、ここでhashKeyであるIdに基づいてこのテーブルに対してクエリを実行する場合、queryを次のように作成します。

私のクエリがId ="123".を持つすべてのアイテムを取得するとします

TestTable testTable = new TestTable();
testTable.setId("123");

DynamoDBQueryExpression<TestTable> queryExpression = new DynamoDBQueryExpression<TestTable>()
                                                                .withHashKeyValues(TestTable)
                                                                .withConsistentRead(false);

次に、Id ="123" and Date ="1234"を持つすべてのアイテムを取得します。

DynamoDBでこれをクエリするにはどうすればよいですか

プログラミング言語としてJavaを使用しています。

13
Geek_To_Learn

AWSを使用したDynamoDBクエリとインデックス作成についての記事を書きましたJava SDK少し前に:http://labs.journwe.com/ 2013/12/15/dynamodb-secondary-indexes /

あなたの場合、それはこのように機能するはずです( http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/JavaQueryScanORMModelExample.html を参照):

AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider());
DynamoDBMapper mapper = new DynamoDBMapper(client);

String hashKey = "123";
long twoWeeksAgoMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L);
Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String twoWeeksAgoStr = dateFormatter.format(twoWeeksAgo);            
Condition rangeKeyCondition = new Condition()
        .withComparisonOperator(ComparisonOperator.GT.toString())
        .withAttributeValueList(new AttributeValue().withS(twoWeeksAgoStr.toString()));

Reply replyKey = new Reply();
replyKey.setId(hashKey);

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
        .withHashKeyValues(replyKey)
        .withRangeKeyCondition("ReplyDateTime", rangeKeyCondition);

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

詳細については、DynamoDBドキュメントのJava Object Persistence Modelセクションをご覧ください。

11
Markus Klems

次のようにdynamoDbMapper.load()を使用できます。

TestTable testTable = new TestTable();
testTable.setId("123");
testTable.setDate("1234");
TestTable result = dynamoDBMapper.load(testTable);
7
Nikita

インデックスを使用しない場合は、_Id ="123"_および_Date ="1234"_のアイテムが1つだけあるはずです。

正確なハッシュキーと範囲キー(_=_演算子の場合)の場合、クエリ操作は必要ありません。 GetItem APIで略奪品を入手してください。 ドキュメントページ を参照してください。

また、範囲キーに非EQ演算子が必要な場合(例:_>=_)、Query操作で key条件式 を使用できます:_Id = :id and Date >= :date_。

3
Mingliang Liu