我有一张桌子说位置有下面的结构
|地点(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。
我能够对扫描做同样的事情,但由于性能原因,我必须使用查询。
请告知我如何实现我想要的输出。
答案 0 :(得分:1)
Query需要表格的主键,因此,没有办法只在Range键上查询。
基本上,由于基于散列键和查询的DynamoDB分区在分区内运行,因此您需要:
构建可用于查询的哈希键。例如。如果范围是非任意的,您可以通过创建" bucket"的属性来提高性能。基于一些不太精细的时间并在其上构建GSI:
答案 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
TimeStamp
和VisitingPerson
的表格。这个想法是你只是复制数据,这在nosql世界中很好。