web-dev-qa-db-ja.com

DynamoDB:クエリフィルターを使用してMAPの条件をチェックする方法

テーブルがあり、構造は次のようになります。

DynamoDB document

クエリを実行するとき、データマップでクエリフィルターを実行できるようにしたいと考えています。しかし、クエリの設定方法は正確にはわかりません。

これは私がこれまでに持っているものです:

HashMap<String, AttributeValue> map = new HashMap<String, AttributeValue>();
map.put("byUserId", new AttributeValue().withS("vl49uga5ljjcoln65rcaspmg8u"));

queryExpression
    .withQueryFilterEntry("data", new Condition()
        .withAttributeValueList(new AttributeValue().withM(map))
        .withComparisonOperator(ComparisonOperator.CONTAINS));

しかし、私がフィルターを構築している方法は正しくなく、次のエラーに遭遇し続けます:

Exception in thread "main" com.amazonaws.AmazonServiceException: One or more parameter values were invalid: ComparisonOperator CONTAINS is not valid for M AttributeValue type (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: CHIOME68L1HVGO81URD7CIOS6BVV4KQNSO5AEMVJF66Q9ASUAAJG)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.Java:1077)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.Java:725)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.Java:460)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.Java:295)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.Java:3106)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.query(AmazonDynamoDBClient.Java:1118)

では、使用する比較演算子とは何ですか(INはリスト型のため)、MAP内で比較を指定できるようにクエリフィルターを作成するにはどうすればよいですか。

ありがとう!

13
ThePedestrian

マップ構造全体ではなく、マップ属性data.byUserIdを比較してみてください。

Table table = dynamoDB.getTable(tableName);

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":x", "vl49uga5ljjcoln65rcaspmg8u");


QuerySpec spec = new QuerySpec()
    .withHashKey("HashKeyAttribute", "HashKeyAttributeValue")
    .withFilterExpression("data.byUserId = :x")
    .withValueMap(expressionAttributeValues);


ItemCollection<QueryOutcome> items = table.query(spec);

Iterator<Item> iterator = items.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next().toJSONPretty());
}

いくつかの重要なガイドライン:

  1. 変数tableNamestringとして表される正しいテーブル名を持っていることを確認してください。

  2. 文字列HashKeyAttributeHash Keyを表す属性名に置き換えてください。

  3. 文字列HashKeyAttributeValueを、照合するハッシュキーを表す値に置き換えてください。

  4. 一致したレコードに、比較式で指定された値を持つdata.byUserIdがあることを確認します。この例では、値"vl49uga5ljjcoln65rcaspmg8u"が指定されています。

ハッシュキーとしてid属性を持つ別の例を次に示します。

Table table = dynamoDB.getTable(tableName);

Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":x", "vl49uga5ljjcoln65rcaspmg8u");


QuerySpec spec = new QuerySpec()
    .withHashKey("id", "25g77vmummpr4mc5mb9vq36q43")
    .withFilterExpression("data.byUserId = :x")
    .withValueMap(expressionAttributeValues);


ItemCollection<QueryOutcome> items = table.query(spec);

Iterator<Item> iterator = items.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next().toJSONPretty());
}
9
bsd