使用OR ConditionalOperator扫描带有两个过滤器相同列的DynamoDB

时间:2014-05-30 17:35:55

标签: amazon-dynamodb

我确信这是一个非常noob的问题,所以我在前面道歉,但我找不到任何人在做这个的例子。

我在桌子上创建了一个列lastrun。我想找到它是null的记录或者它小于x的记录。我无法弄清楚如何运行它,因为它似乎只评估我的两个条件之一,因为当我将第二个条件放在地图中时,同一个列的相同键会覆盖我在地图中的第一个条目。我错过了什么?

         Condition newRunsFilterCondition = new Condition()
    .withComparisonOperator(ComparisonOperator.EQ.toString())
    .withAttributeValueList(new AttributeValue().withN("0"));

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, -1);

     Condition exRunsFilterCondition = new Condition()
    .withComparisonOperator(ComparisonOperator.LT.toString())
    .withAttributeValueList(new AttributeValue().withN("" + cal.getTime().getTime()));

    Map<String, Condition> conditions = new HashMap<String, Condition>();
    conditions.put("lastrun", newRunsFilterCondition);
    conditions.put("lastrun", exRunsFilterCondition);

    ScanRequest scanRequest = new ScanRequest()
        .withTableName("DataLoaderSchedule")
        .withScanFilter(conditions).withConditionalOperator("OR");

    ScanResult result = client.scan(scanRequest);

1 个答案:

答案 0 :(得分:1)

我不认为DynamoDb目前支持同一列上的2个过滤器......

conditions.put("lastrun", newRunsFilterCondition);
conditions.put("lastrun", exRunsFilterCondition);

Conditions变量是一个地图,目前单个属性只能映射到一个条件。这就是为什么你不能在一列上有两个条件。

我能想到的解决方法是你进行两次扫描,每次使用不同的滤镜。然后将结果合并到您的身边。