假设我的表如下所示:
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))
我打算将主键与附加的LSI(EndDate)一起用作哈希和范围键(代码,StartDate),并对其进行查询。我不确定是否有办法实现这一目标。我不想使用该SCAN
操作,因为它似乎扫描了整个表,这可能会非常昂贵。
另外,想在单个查询中实现这一点。
一种选择是使用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());
}
有关更多详细信息,请参见使用条件表达式指定条件。
此外,尽管上一个查询仅使用Hash Key
,您仍Range Key
可以按以下格式将包含日期的记录分组:
StartDate#EndDate
表结构:
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
您仍会得到按日期排序的记录。另外,我相信遵循有关明确日期格式的建议是一个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句