dynamodb表上的过滤
本文关键字:过滤 dynamodb | 更新日期: 2023-09-27 17:50:15
我有一个表说位置下面的指令
|位置(Hashkey-String) |时间戳(Range-Numeric) | # visiting_Person |
现在我想要得到两个时间戳之间的所有访问人员
Table myTable= Table.LoadTable(client, "tableName");
QueryFilter filter = new QueryFilter();
filter.AddCondition("TimeStamp", QueryOperator.GreaterThan, 56545454);
Search search = myTable.Query(filter);
但是会抛出错误-
查询条件缺少模式元素:Location
从错误看来,我必须在过滤器中添加位置(因为它是哈希键),但我不必对特定位置进行过滤,我必须在时间戳
内获得任何位置我尝试将时间戳设置为hashkey,但我发现我们只能在hashkey上应用相等运算符。
在调试和使用其他方式更改时,我遇到了其他错误,即keycondition不能应用
我可以用scan做同样的事情,但是由于性能问题,我必须使用Query.
请告诉我怎样才能达到我想要的输出。
查询需要表的主键,所以没有办法只查询范围键。
基本上,由于DynamoDB基于散列键进行分区,而Query在分区内操作,因此您需要:
- 跨散列键扫描(通过并行扫描可以提高性能)
-
构造可用于查询的散列键。例如,如果范围是非任意的,你可以通过基于一些不太细粒度的时间为"bucket"创建一个属性并在其上构建一个GSI来提高性能:
- 假设两个时间戳之间的最大范围是1天,您可以:
- 创建一个日期级别粒度的属性(比如"TimeStampDate"),而不是日期+时间时间戳粒度。
- 用TimeStampDate作为哈希键创建GSI
- 对重叠查询时间范围的日期执行并行查询:"TimeStampDate=[开始时间戳日期]AND timestamp BETWEEN[开始时间戳/结束时间戳]","TimeStampDate=[开始时间戳日期+ 1天]AND timestamp BETWEEN[开始时间戳/结束时间戳]",等等。
我知道这在Cassandra(遵循Dynamo的设计)中不起作用。逻辑是,你必须指定"任何前面的键",例如,如果你有
<>之前+---------+---------+--------+| Col1 | Col2 | Value |+---------+---------+--------+|值1 |值1 | 123 ||值2 |值2 | 123 ||值3 |值4 | 123 |+---------+---------+--------+之前您必须指定Col1
,然后才能通过Col2
进行筛选,如果关键字是Col1 and Col2
。在Cassandra中,Col1
将指示记录位于集群环中的哪个db服务器上,Col2
将是该特定服务器上该表中的列键。希望现在大家清楚了为什么在搜索查询中指定集群键是很重要的。
要解决这个问题,您有两个选择:
- 将查询更改为通过
Location
- 添加另一个只有
TimeStamp
和VisitingPerson
两列的表。这个想法是,你只是复制数据,这在nosql世界中是很好的