在dynamodb表上过滤

时间:2015-05-20 12:06:40

标签: c# amazon-dynamodb nosql

我有一张桌子说位置有下面的结构

|地点(Hashkey字符串)|时间戳(范围数字)| #visiting_Person |

现在我想让两个时间戳之间的所有访问者

public boolean isValidEmail(String email){
        String EMAIL_PATTERN =
                "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
        return email.matches(EMAIL_PATTERN);
    }

但它会抛出错误 -

  

查询条件错过架构元素:位置

从错误中我似乎必须在过滤器中添加位置(因为它是散列键),但我不必在特定位置上过滤,我必须在时间戳内获取任何位置

我尝试将timestamp设置为hashkey但我发现我们只能在hashkey上应用相等的运算符。

在调试和更改时,我遇到了其他错误,即无法应用keycondition。

我能够对扫描做同样的事情,但由于性能原因,我必须使用查询。

请告知我如何实现我想要的输出。

2 个答案:

答案 0 :(得分:1)

Query需要表格的主键,因此,没有办法只在Range键上查询。

基本上,由于基于散列键和查询的DynamoDB分区在分区内运行,因此您需要:

  1. 扫描哈希键(通过并行扫描可以提高性能)
  2. 构建可用于查询的哈希键。例如。如果范围是非任意的,您可以通过创建" bucket"的属性来提高性能。基于一些不太精细的时间并在其上构建GSI:

    • 假设2个时间戳之间的最大范围是1天,您可以:
    • 创建一个属性(例如" TimeStampDate"),它是日期级别的粒度而不是日期+时间时间戳粒度。
    • 使用TimeStampDate作为Hash密钥创建GSI
    • 对与查询时间范围重叠的日期执行并行查询:" TimeStampDate = [开始时间戳日期]和TimeStamp BETWEEN [开始时间戳/结束时间戳]"," TimeStampDate = [start时间戳日期+ 1天]和TimeStamp BETWEEN [开始时间戳/结束时间戳]"等等。

答案 1 :(得分:0)

我知道这不适用于Cassandra(遵循Dynamo的设计)。逻辑是你必须指定“任何先前的键”,例如如果你有

+---------+---------+--------+
|  Col1   |  Col2   | Value  |
+---------+---------+--------+
| Value 1 | Value 1 |    123 |
| Value 2 | Value 2 |    123 |
| Value 3 | Value 4 |    123 |
+---------+---------+--------+

必须 指定Col1,然后才能按Col2进行过滤,前提是密钥为Col1 and Col2。在Cassandra中,Col1将指示记录所在的群集环中的哪个数据库服务器,Col2将是该特定服务器上该表中的列密钥。希望现在很清楚为什么在搜索查询中指定集群密钥很重要。

要解决此问题,您有两种选择:

  • 更改您的查询以通过Location
  • 添加另一个只有两列TimeStampVisitingPerson的表格。这个想法是你只是复制数据,这在nosql世界中很好。