我们假设我的表格如下:
Code |StartDate |EndDate |Additional Attributes...
ABC |11-24-2015 |11-26-2015 | ....
ABC |12-12-2015 |12-15-2015 | ....
ABC |10-05-2015 |10-10-2015 | ....
PQR |03-24-2015 |03-27-2015 | ....
PQR |05-04-2015 |05-08-2015 | ....
提供代码(c)和日期范围(x,y),我需要能够查询类似的项目:
Query => (Code = c) AND ((StartDate BETWEEN x AND y) OR (EndDate BETWEEN x AND y))
我计划使用主键作为哈希和范围键(Code,StartDate)和附加的LSI(EndDate)并对其进行查询。
我不确定是否有办法实现这一目标。我不想使用SCAN
操作,因为它似乎扫描整个表格,这可能是非常昂贵的。
此外,希望在单个查询中实现此目的。
答案 0 :(得分:1)
一种选择是使用QUERY
和FilterExpression
来完成此操作。无需在此案例中定义LSI
。您必须使用Hash Key
运算符通过EQ
进行查询,然后使用“过滤器表达式”缩小结果范围。以下是Java SDK的一个示例:
Table table = dynamoDB.getTable(tableName);
Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":x", "11-24-2015");
expressionAttributeValues.put(":y", "11-26-2015");
QuerySpec spec = new QuerySpec()
.withHashKey("Code", "CodeValueHere")
.withFilterExpression("(StartDate between :x and :y) or (EndDate between :x and :y)")
.withValueMap(expressionAttributeValues);
ItemCollection<QueryOutcome> items = table.query(spec);
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
有关详细信息,请参阅Specifying Conditions with Condition Expressions。
此外,虽然之前的查询仅使用Hash Key
,但您仍然可以使用包含以下格式的日期的Range Key
对记录进行分组:
的StartDate#结束日期
表格结构:
Code DateRange |StartDate |EndDate
ABC 11-24-2015#11-26-2015 |11-24-2015 |11-26-2015
ABC 12-12-2015#12-15-2015 |12-12-2015 |12-15-2015
ABC 10-05-2015#10-10-2015 |10-05-2015 |10-10-2015
PQR 03-24-2015#03-27-2015 |03-24-2015 |03-27-2015
PQR 05-04-2015#05-08-2015 |05-04-2015 |05-08-2015
这种方式如果您碰巧只通过Hash Key
进行查询,您仍然会获得按日期排序的记录。另外,我认为遵循有关明确日期格式的建议是个好主意.nu