DynamoDB高级扫描-JAVA
我需要通过位于一列中的子字段JSON扫描表。不幸的是,我在Java中找不到任何地方的例子,也不知道这是否可行 这是我的数据,这个json表示对象——dynamodb中的一行。 json代表3个java类: -主类,其中包含类city和一些字符串记录 -城市包含一条等级公路 是否可以扫描数据库并找到mainName=“xyz”且具有名为“Rockingham”的城市记录的记录 “房子”:{ “huseName”:“Wendy Carson” } } 我有一些类似的工作,但这还不足以查询正确的数据。 Table Table=dynamoDB.getTable(tableName)DynamoDB高级扫描-JAVA,java,json,amazon-dynamodb,Java,Json,Amazon Dynamodb,我需要通过位于一列中的子字段JSON扫描表。不幸的是,我在Java中找不到任何地方的例子,也不知道这是否可行 这是我的数据,这个json表示对象——dynamodb中的一行。 json代表3个java类: -主类,其中包含类city和一些字符串记录 -城市包含一条等级公路 是否可以扫描数据库并找到mainName=“xyz”且具有名为“Rockingham”的城市记录的记录 “房子”:{ “huseName”:“Wendy Carson” } } 我有一些类似的工作,但这还不足以查询正确的数据。
Map expressionAttributeValues=newhashmap();
expressionAttributeValues.put(“:pr”,300);
ItemCollection items=table.scan(
“floatVariable<:pr”,//FilterExpression
“Id,mainName,floatVariable,city”,//ProjectionExpression
null,//ExpressionAttributeNames-本例中未使用
表达式属性值);
System.out.println(“价格低于300的项目的“+tableName+”扫描”);
迭代器迭代器=items.Iterator();
while(iterator.hasNext()){
System.out.println(iterator.next().toJSONPretty());
}
我在php中看到了类似的示例,但不幸的是,它在Java中不起作用
ItemCollection<ScanOutcome> items = table.scan(
" cites.name = :dupa ", //FilterExpression
"Id, mainName, floatVariable, city", //ProjectionExpression
null, //ExpressionAttributeNames - not used in this example
expressionAttributeValues);
ItemCollection items=table.scan(
“cites.name=:dupa”,//FilterExpression
“Id,mainName,floatVariable,city”,//ProjectionExpression
null,//ExpressionAttributeNames-本例中未使用
表达式属性值);
城市属性是一个长度不同的列表吗?如果要使用服务器端筛选,则需要枚举要检查的列表中的每个元素
或者,您可以维护一个单独的城市名称列表,并在该属性上使用“contains”操作符。如果您是通过
城市进行查询。name
您的数据模型必须考虑到这一点。我建议每个表项有一个城市:
{
"Id": "9",
"mainName": "xyz",
"cityName": "Rockingham",
"floatVariable": 228.3,
"road": [
{
"roadName": "Traci",
"roadLength": 118
},
{
"roadName": "Watkins",
"roadLength": 30
}
]
}
]}
哈希键是cityName
属性,范围键是使主键(哈希+范围键)唯一的任何其他属性,例如:Id
QuerySpec querySpec = new QuerySpec()
.withHashKey("cityName", "Rockingham")
.withProjectionExpression("Id, mainName, floatVariable, road");
ItemCollection<QueryOutcome> items = table.query(querySpec);
表B
主键类型:哈希键
散列键:Id
{
"Id": "9",
"mainName": "xyz",
"floatVariable": 228.3
}
检索城市项目后,您将通过query
、GetItem
或BatchGetItem
按Id查询表B
这两个选项都允许您使用查询
操作,而不是扫描
,从而实现更简单的查询,具有更好的性能和更低的成本:
扫描操作始终扫描整个表或辅助索引,
然后过滤掉值以提供所需的结果,基本上
添加从结果集中删除数据的额外步骤。避开
对大表或索引使用扫描操作,并使用
如果可能,删除许多结果。此外,随着表或索引的增长,
扫描操作会变慢。扫描操作会检查每个项目是否存在错误
请求的值,并且可以使用为
单个操作中的大型表或索引。为了更快的响应时间,
设计表和索引,以便应用程序可以使用查询
而不是扫描。(对于表,您也可以考虑使用GestITEM)。
和BatchGetItemAPI。)
来源:“cites.name=:dupa”//filtereexpression我想写“city.name”好了,现在我知道我不能扫描第二级属性,唯一的查询方法是快速的,值得在我的应用程序中使用。(仅扫描报告)
QuerySpec querySpec = new QuerySpec()
.withHashKey("cityName", "Rockingham")
.withProjectionExpression("Id, mainName, floatVariable, road");
ItemCollection<QueryOutcome> items = table.query(querySpec);
{
"cityName": "Rockingham",
"Id" : 9,
"road": [
{
"roadName": "Traci",
"roadLength": 118
},
{
"roadName": "Watkins",
"roadLength": 30
}
]
}
]}
{
"Id": "9",
"mainName": "xyz",
"floatVariable": 228.3
}