DynamoDB 高级扫描 - JAVA
DynamoDB advanced scan - JAVA
我需要按位于一列中的子字段 JSON 扫描 table。不幸的是,我在 Java 中找不到任何例子,也不知道是否可行。
这是我的数据,这个 json 代表对象 - dynamodb 中的一行。
json代表3个javaclasses:
- main class 包含 class 城市和一些字符串记录
- 城市包含一条 class 道路
是否可以扫描数据库并找到 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 table = dynamoDB.getTable(table姓名);
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);
city 属性是一个长度不一的列表吗?如果要使用服务器端筛选,则需要枚举要检查的列表中的每个元素。
或者,您可以维护一个单独的城市名称列表,并在该属性上使用 "contains" 运算符。
如果您通过 city.name
进行查询,您的数据模型必须考虑到这一点。我建议每个 table 项目有一个城市:
{
"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);
作为第二个选项,您可以定义两个 tables:
Table一个
主键类型:哈希键 + 范围键
哈希键:cityName
范围键:Id
(参考Table B项)
{
"cityName": "Rockingham",
"Id" : 9,
"road": [
{
"roadName": "Traci",
"roadLength": 118
},
{
"roadName": "Watkins",
"roadLength": 30
}
]
}
]}
Table B
主键类型:哈希键
哈希键:Id
{
"Id": "9",
"mainName": "xyz",
"floatVariable": 228.3
}
检索城市项目后,您可以通过 Query
、GetItem
或 BatchGetItem
.
按 ID 查询 Table B
这两个选项都允许您使用 Query
操作而不是 Scan
,从而实现更简单的查询、更好的性能和更低的成本:
A Scan operation always scans the entire table or secondary index,
then filters out values to provide the desired result, essentially
adding the extra step of removing data from the result set. Avoid
using a Scan operation on a large table or index with a filter that
removes many results, if possible. Also, as a table or index grows,
the Scan operation slows. The Scan operation examines every item for
the requested values, and can use up the provisioned throughput for a
large table or index in a single operation. For faster response times,
design your tables and indexes so that your applications can use Query
instead of Scan. (For tables, you can also consider using the GetItem
and BatchGetItem APIs.).
来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
我需要按位于一列中的子字段 JSON 扫描 table。不幸的是,我在 Java 中找不到任何例子,也不知道是否可行。
这是我的数据,这个 json 代表对象 - dynamodb 中的一行。 json代表3个javaclasses: - main class 包含 class 城市和一些字符串记录 - 城市包含一条 class 道路
是否可以扫描数据库并找到 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 table = dynamoDB.getTable(table姓名);
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);
city 属性是一个长度不一的列表吗?如果要使用服务器端筛选,则需要枚举要检查的列表中的每个元素。
或者,您可以维护一个单独的城市名称列表,并在该属性上使用 "contains" 运算符。
如果您通过 city.name
进行查询,您的数据模型必须考虑到这一点。我建议每个 table 项目有一个城市:
{
"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);
作为第二个选项,您可以定义两个 tables:
Table一个
主键类型:哈希键 + 范围键
哈希键:cityName
范围键:Id
(参考Table B项)
{
"cityName": "Rockingham",
"Id" : 9,
"road": [
{
"roadName": "Traci",
"roadLength": 118
},
{
"roadName": "Watkins",
"roadLength": 30
}
]
}
]}
Table B
主键类型:哈希键
哈希键:Id
{
"Id": "9",
"mainName": "xyz",
"floatVariable": 228.3
}
检索城市项目后,您可以通过 Query
、GetItem
或 BatchGetItem
.
这两个选项都允许您使用 Query
操作而不是 Scan
,从而实现更简单的查询、更好的性能和更低的成本:
A Scan operation always scans the entire table or secondary index, then filters out values to provide the desired result, essentially adding the extra step of removing data from the result set. Avoid using a Scan operation on a large table or index with a filter that removes many results, if possible. Also, as a table or index grows, the Scan operation slows. The Scan operation examines every item for the requested values, and can use up the provisioned throughput for a large table or index in a single operation. For faster response times, design your tables and indexes so that your applications can use Query instead of Scan. (For tables, you can also consider using the GetItem and BatchGetItem APIs.).
来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html