DynamoDB嵌套查询对象集

时间:2017-08-24 22:50:49

标签: java amazon-dynamodb aws-sdk

我有一个名为Group的表,它将有如下记录:

{
"id": "UniqueID1",
"name": "Ranjeeth",
"emailIdMappings": [
  {
    "emailId": "r.pt@r.com",
    "userId": 324
  },
  {
    "emailId": "r1.pt@r.com",
    "userId": 325
  }
]
},
{
"id": "UniqueID2",
"name": "Ranjeeth",
"emailIdMappings": [
  {
    "emailId": "r1.pt@r.com",
    "userId": 325
  },
  {
    "emailId": "r2.pt@r.com",
    "userId": 326
  }
]
}

如果emailId包含输入字符串,我需要查询并获取结果。 到目前为止,我已达不到结果

AttributeValue attributeValue = new AttributeValue("r.pt@r.com");
Condition containsCondition = new Condition()
            .withComparisonOperator(ComparisonOperator.CONTAINS)
            .withAttributeValueList(attributeValue);

Map<String, Condition> conditions = newHashMap();
conditions.put("emailIdMappings.emailId", containsCondition);

ScanRequest scanRequest = new ScanRequest()
            .withTableName("Group")
            .withScanFilter(conditions);
amazonDynamoDB.scan(scanRequest) 
dynamoDBMapper.marshallIntoObjects(Group.class, scanResult.getItems()); 

对于上面的代码,我期待ID为UniqueID1的记录,但它是空的。如果你通过"r1.pt@r.com"那么你应该得到两个记录。 使用的sdk是com.amazonaws:aws-java-sdk-dynamodb:1.11.155

我尝试在aws论坛中发布这个问题并没有多大帮助。

1 个答案:

答案 0 :(得分:0)

由于您拥有对象列表,该对象在对象中具有两个属性(即emailId和userId),因此您需要提供这两个值才能匹配该项目。

如果对象有两个属性且过滤器表达式中只提到一个属性值,则CONTAINS函数将无法匹配该项。

否则,您需要提供列表的匹配项(即索引)以匹配项目。

示例: -

emailIdMappings[0].emailId = :emailIdVal