DynamoDB“OR”条件范围查询

时间:2015-04-25 15:25:12

标签: amazon-dynamodb

我们假设我的表格如下:

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

此外,希望在单个查询中实现此目的。

1 个答案:

答案 0 :(得分:1)

一种选择是使用QUERYFilterExpression来完成此操作。无需在此案例中定义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