DynamoDB“ OR”条件范围查询

普拉山斯市

假设我的表如下所示:

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操作,因为它似乎扫描了整个表,这可能会非常昂贵。

另外,想在单个查询中实现这一点。

bsd

一种选择是使用QUERY进行此操作FilterExpression无需LSI在这种情况下定义你将不得不通过查询Hash KeyEQ操作,然后缩小与过滤器表达式的结果。这是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章