我需要通过子字段JSON扫描表,它位于一列中 . 不幸的是,我无法在Java中找到任何示例,也不知道是否可能 .
这是我的数据,这个json代表对象 - 在dynamodb中有一行 . json代表3个java类: - 包含类城市的主类和一些字符串记录 - 城市包含类路
是否可以扫描数据库并找到mainName =“xyz”的记录并拥有一个名为“Rockingham”的城市记录
{
"Id": "9",
"mainName": "xyz",
"floatVariable": 228.3,
"city": [
{
"name": "Rockingham",
"road": [
{
"roadName": "Traci",
"roadLength": 118
},
{
"roadName": "Watkins",
"roadLength": 30
}
]
}
],
“house”:{“huseName”:“Wendy Carson”}}
我有一些这样的和这项工作,但这还不足以查询正确的数据 . 表table = dynamoDB.getTable(tableName);
Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":pr", 300);
ItemCollection<ScanOutcome> items = table.scan(
"floatVariable < :pr", //FilterExpression
"Id, mainName, floatVariable, city" , //ProjectionExpression
null, //ExpressionAttributeNames - not used in this example
expressionAttributeValues);
System.out.println("Scan of " + tableName + " for items with a price less than 300.");
Iterator<Item> iterator = 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);
2 回答
如果您通过_1837620查询,则您的数据模型必须考虑到这一点 . 我建议每个表项目有一个城市:
哈希键是
cityName
属性,而范围键是使主键(哈希范围键)唯一的任何其他属性,例如:Id
.作为第二个选项,您可以定义两个表:
Table A
主键类型:哈希键键范围键
哈希键:
cityName
范围键:Id
(参考表B项)Table B
主键类型:哈希键
哈希键:
Id
检索城市项目后,您将通过Id通过
Query
,GetItem
或BatchGetItem
查询表B.这两个选项都允许您使用
Query
操作而不是Scan
,从而使更简单的查询具有更好的性能和更低的成本:资料来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
城市属性是不同长度的列表吗?如果要使用服务器端过滤,则需要枚举要检查的列表的每个元素 .
或者,您可以维护单独的城市名称列表,并在该属性上使用“包含”运算符 .